Benq M22模块控制与数据传输程序(待续)

来源:互联网 发布:网络揭阳广播电视大学 编辑:程序博客网 时间:2024/05/16 07:44
 

GPRS模块控制与数据传输程序

GPRS模块的工作是通过串口发送AT指
令集来实现的,单片机程序用来实现模块状态的设置、工作方式的控制、通讯链路的设置和维护、通讯数据的发送和接收等功能。M22支持嵌入式的TCP/IP协议大大缩短二次开发时间,这个嵌入式的TCP/IP协议解决了从命令模式连接到数据传输模式的一个比较复
杂的过程

转载请注明出处:http://hi.baidu.com/luv%5Fresplendent/blog/item/3dbc97d3dfd127053bf3cf04.html 谢谢
AT命令集
    Benq M22通讯模块支持标准AT command (3GPP 27.07/27.05)可以用外部设备通过AT命令集来控制( AT命令原本是用于有线电话调制解调器(MODEM)的,它是用来控制MODEM的状态设置和操作的一套指令,它在MODEM的命令模式下由用户输入,MODEM分析和执行该命令,并向主机发送一个响应代码。所有的AT命令(除了重复命令A/以外)都由Al,开头,后面紧跟一个可打印的ASCII码字符,还可能有一个可选的操作数,操作数缺省代表0操作数,
命令序列可以是大写,也可以是小写。
      MODEM会根据收到的字符检测出主机的波特率、检验方式和字符格式,并转换成相应的格式,以保证能够正确的解释主机发送的数据。AT命令后续字符被存入命令缓冲区,直到接收到回车字符,
MODEM就执行这一命令,最后把执行的结果(OK, ERROR,
CONNECT)发回主机。


GPRS控制程序
    M22嵌入式TCP/IP是透明传输模式,所谓的透明传输就是使用者不必在发送的时候对数据进行打包,在接收数据的时候也不必对数据进行解包,而是直接发送需要发送的数据和接收需要接收的数据。
    GPRS模块首先建立一个TCP/IP链路,其AT,命令设置过程如下:
    (1)首先,使用串口发送函数printf()向M22发送一个AT,看模块是否准备就绪。发送方式如下:
      Printf("AT",0x0D,0x0A);
发送的实际内容是AT和十六进制的OxOD, OxOA, AT是命令的内容,OxOD, OxOA是空格和回车对M22模块来说是命令或信息的结束,模块检测到这两个字节时,就开始执行命令或发送信息。
      (2)接下来发送AT$NOSLEEP=1,发送方法同上面相同,这个指令使模块不进入深度休眠状态,如果去掉此条命令在长时间不向模块发送信息,模块的串口会处于休眠状态所以会丢失发送的前几个数据,而使用这个指令去掉模块的休眠功能后电流的上升并不明显,所以我们在每次启动模块的时候都把这条指令加进去。
      (3)另外,我们还要设置发送延时时间,即在设置的时间内没有收到回车字符,则将缓冲区内的数据发送出去,AT$TIMEOUT=XX这个XX就代表了延时参数,数值为100-5000,单位是毫秒,这里我们设为5000
      (4)下面是跟登陆网络有关的AT命令,AT+CGDCONT=1,"IP"," CMNET",这是一条对PDP环境设置的AT指令,CMNET是中国移动的APNo
      (5) AT%CGPCO=1, "PAP,,”,1这条指令指定了验证的方式以及用户名称和秘密,由于GPRS支持空的用户名和密码,所以这里的用户名和密码为空,验证的方式为PAP.
      (6) AT$DESTINFO="XX.XX.XX.XX",(1, 2), PORT而这条AT指令指定了远端公网的IP,传输的数据格式和端口号,需要说明的是,若是选择1则表明使用TCP/IP的数据格式传输数据,若是选择2则表明使用UDP格式传输数据,这里选择1, TCP/IP的数据传输格式,PORT为远端公网IP的端口号。
      (7)完成以上步骤后,则可以使用ATD*97#这条AT命令进行拨号了。
    上面的整个过程的代码如下:
    Printf("AT",OxOD,MA);
    Printf("AT$NOSLEEP=1”,OxOD,OxOA);
    Printf("AT$TIMEOUT=500",NOD,OxOA);
    Printf("AT+CGDCONT=1,%cIP%c, %c CMNET%c",0x22,0x22,
0x22,0x22,OxOD,MA);
    Printf("AT%CGPCO=1,%cPAP,,%c ",0x22,0x22,OxOD,OxOA);
    Printf("AT$DESTINFO=%c",0x22);//①
    Dol
    Putchar(ip_address[i]);
    lwhile(ip-address[i]!="0x00");
    Printf("%c,1,1001",0x22,OxOD,OxOA);//②
    Printf("ATD * 97#",OxOD,MA);
    上面的①一②的部分是用来发送AT$DESTINFO ="XX.XX.XX.XX",(1, 2), PORT命令的,因为IP地址单独输入并存储的ip-address数组中,所以在上面我们把IP地址从ip_address中读出并通过Putchar()函数发送给M22模块。
    这里需要说明的是,拨号的过程中远端的端口必须处于监听状态,否则无法拨通。
    一旦TCP/IP链路建立起来我们就可以通过这个链路与监控平台的端口进行数据传输,另外我们还要关注TCP/IP链路的状态,主要是要关心链路是否在线,为了解决链路掉线问题我们在软件上设置了握手机制,其流程如图所示。


      重拨的过程是设置一个1秒钟的定时器,在每次在进入定时器中断服务子程序我们定义的5分钟定时标志就累加1,当这个标志累加到300时进行重拨设置,重拨过程与上面讲的登陆过程相同,如果没有达到300则返回主程序,5分钟定时标志除了在重拨后清零外,主要的清零位置在接收网络信息的子程序中,当接收到网络的信息时证明还没有断线,该标志位清零不用重拨,所以,监控平台会隔3分钟发送一个握手信号给信息终端,如果超过5分钟没有收到任何网络信息则进行重拨。

下一篇:wap协议与彩信

转载请注明出处:http://hi.baidu.com/luv%5Fresplendent/blog/item/3dbc97d3dfd127053bf3cf04.html谢谢