余坤杰
(暨南大学 信息技术研究所,广东 广州510075)
GPRS无线通信以IP封包形式传输,通信计费是以其传输资料流量计费,通信费用便宜、技术成熟、传输速度快。因此,GPRS无线通信被广泛地应用于远程无线控制终端设备通信中。
随着GPRS无线通信技术研究的不断发展,GPRS无线通信已经被模块化,用户只需要负责GPRS模块与自己的处理器之间的通信,即可实现GPRS无线通信。
本文选用GTM900作为GPRS通信模块,LPC2214作为驱动GPRS模块的处理器,通过UART串口控制GPRS模块,最终实现了GPRS无线通信远程控制I/O口终端的设计。整个设计采用UCOS操作系统[1]控制,串口通信采用标准的MODBUS协议,深入地解析了GPRS通信数据帧格式和MODBUS协议数据帧格式,从而规范了整个GPRS通信和串口通信的方式,从而确保了GPRS无线通信稳定且可靠。
GTM900是一款可以通过AT命令实现GPRS无线通信的通信模块,其系统框图如图1所示。TE是与GTM900连接的串口通信设备,TA是终端调制器,ME是移动设备。首先,串口通信设备TE可以通过串口通信的方式向GTM900发送AT命令,AT命令经过TA调试终端解析,返回对应的结果,并将结果发送到TE,如果需要跟互联网连接,则TA可以通过ME移动设备将信息发送到网络上去,也可以通过ME将网络数据接收回来,并传输到TE处理。
图1 GTM900的结构框图
本设计采用LPC2214作为TE串口通信设备,负责GPRS模块的驱动和通信数据的处理。如图2所示,LPC2214的串口负责控制GTM900的串口,由R22和C12组成的RC充电电路为GTM900提供上电复位信号,在上电复位之后,GTM900就可以通过串口信号线RX和TX完成和LPC2214的串口通信和数据交互。
图2 GPRS模块与LPC2214的硬件连接[2]
在GTM900硬件与LPC2214连接之后,首先要对GPRS模块进行硬件检测和初始化,整个流程如图3所示。首先,检测GPRS模块功能是否正常工作,对应的AT命令为“AT”,即LPC2214需要通过串口向GTM900发送字符串“AT”,如果正常,则GTM900会返回“OK”字符串到LPC2214的串口FIFO中;接下来就是关闭回显功能,对应的AT命令为“ATEO”,这一步主要是防止向GTM900发送的AT命令返回传输;接下来测试SIM卡是否正常工作,对应的AT命令为“AT%TSIM”;最后,配置APN参数,对应的AT命令为AT+CGDCONT=1,“IP”,“CMET”,整个GPRS初始化完成,可以开始连接网络。
图3 GPRS模块初始化流程框图
GTM900的整个控制都是通过AT命令来完成的,对于每一种通信方式,都有对应的AT命令,由AT命令控制器完成对应命令的解析和实现。GTM900的连接网络过程如图4所示。首先,在连接网络之前,要查询GPRS信号强度情况,需要LPC2214串口向GTM900发送字符串“AT+CSQ”,如果信号良好,就可以注册移动网络;注册移动网络对应的AT命令为“AT+CGREG?”或“AT+CGEG?”,其中,LPC2214串口发送字符串“AT+CGREG?”表示注册本地网络,发送“AT+CGEG?”表示注册漫游网络;接下来就是TCP/IP的初始化,对应的AT命令为AT%ETCPIP=“USER”,“GPRS”,其中USER和GPRS代表用户名和密码,可以自己根据需要设定,中间必须加上逗号分开;接下来就是选用域名解析连接上位机,对应的AT命令为AT%DNSR=“域名”,域名就是用户GPRS需要解析的域名;最后,连接Internet,对应的AT命令为AT%IPOPEN=“TCP”,“DEST_IP”,“DEST_PORT”,其中,TCP代表TCP通信方式,DEST_IP和DEST_PORT代表目的IP地址和端口号,整个GPRS连接网络流程完成,如果连接网络顺利,则可以通过GPRS发送和接收IP数据包了。
图4 GPRS模块连接网络流程图
GPRS在连接上无线网络之后,便可以进行TCP/IP网络数据通信了。GPRS在TCP/IP通信时发送数据帧格式为:AT%IPSEND=“DATA”,其中,“AT%IPSEND=”是启动TCP/IP发送命令字符串,双引号里面的DATA是用户发送的数据,只要用户以GPRS发送帧格式向GPRS模块发送一串GPRS发送数据帧,在GPRS接收端便可以接收到一帧GPRS数据帧。GPRS接收数据帧格式为:%IPDATA:<LEN>,“DATA”,其中,“%IPDATA:”为接收数据帧包头,LEN为接收到用户发送过来的字节数,一共占用两个字节,DATA是用户发送过来的数据。
MODBUS协议[3]是一个请求/应答协议,可以用来规范主机和从机之间的通信方式。MODBUS协议规范、稳定且可靠,在串口通信上已经得到广泛的应用。通用MODBUS数据帧格式如图5所示。
图5 通用MODBUS数据帧
GPRS主要是通过串口控制和交换数据,因此,采用标准的串口通信协议MODBUS协议可以规范GPRS传输用户数据段DATA,本文定义了2个MODBUS功能号,写多个寄存器和读多个寄存器,并将这2个功能号对应的用户数据段按照MODBUS协议标准解析成如图6和图7的格式。
设备号用来规定与GPRS模块通信的具体设备,占1个字节。功能号0x10代表写多个寄存器,对应图6数据帧格式,寄存器首地址代表数据写入第一个寄存器的地址,占两个字节,寄存器数代表连续从首寄存器开始写入的寄存器总数,占2个字节,写入寄存器的数据就是对应写入寄存器中的数据,每个寄存器对应其中1个字节的写入数据,最后是2个字节的CRC校验码;功能号0x03代表读多个寄存器,对应图7数据帧格式,与写多个寄存器相对应。
GPRS模块与LPC2214之间的通信都是通过串口来完成的,其中,主要的串口处理包括串口发送和接收,而串口发送和接收都是以串口中断的形式请求CPU处理。下面定义了UART接收和发送参数结构体:
上海市水务信息中心的IT基础环境成为政府机构计算机信息系统等级保护的重要对象,计算机网络中会有大量的日常办公信息和业务信息,如人事、科研、项目、招标投标等各种办公信息和大量业务化系统采集、传输和处理的业务信息。信息安全涉及的人员、过程、技术是IT运维管理中一项重要内容。
typedef struct uart_rec
{volatile uint8 Buffer[UART1_REC_LENGTH];//接收缓冲区
volatile uint16 BufCount;//缓冲区的数据字节数
volatile uint8 Receiving;//正在接收字符的标志
volatile uint8 OverFlag;//接收完成标志
volatile uint8 Data[UART1_REC_LENGTH];//接收数据区,1 500字符
volatile uint8 DataOK;//数据复制到数据区完成标志
typedef struct uart_txd
{volatile char Buffer[UART1_TXD_LENGTH];
volatile char Sending;//正在发送字符的标志
volatile uint16 Length;
}volatile Txd;
对于UART发送参数结构体很简单,只需要3个参数。其中,Buffer为串口需要发送的GPRS数据帧缓存区;Sending用来标志是否正在发送数据,用来防止在发送数据的时候再次启动数据发送;Length是用来标志每次发送数据时Buffer中存放的字符数,发送GPRS数据帧时,通过不断的判断和修改Txd.Length可以控制GPRS数据帧的发送,当Txd.Length=0时表示一帧GPRS数据帧发送完毕。UART接收参数结构体比较复杂,其中,Buffer为接收GPRS数据帧缓存区;BufCount用来表示接收到GPRS数据帧的字节数;Receiving用来防止在接收数据的时候启动数据发送,这里特地添加了一个OverFlag接收完成标志,用来监视GPRS数据帧是否接收完成,当接收完成后,开始复制Buffer中的数据到Data中;DataOK表示GPRS数据帧复制完成。
整个系统设计流程图[4]如图8所示。首先,初始化LPC2214和UCOS操作系统,LPC2214初始化主要有PLL时钟初始化、中断初始化等。由于使用到UART1串口中断,所以需要初始化串口1中断,定时器0为UCOS操作系统提供系统节拍时钟,所以还需要初始化定时器0中断。
图8 GPRS通信系统流程图
在UCOS操作系统初始化之后,整个系统的操作都可以使用UCOS操作系统的任务管理来实现。本设计一共创建了5个任务,分别是:GPRS初始化任务;GPRS连网任务;GPRS信号强度查询任务;串口接收数据处理任务;串口发送数据处理任务。其中,串口接收数据处理任务对应等待信号量队列,用来接收IP数据包的不同功能号,并做出对应处理;串口发送处理任务对应发送一个信号量队列,用来发送不同IP功能号回文;而其他3个任务都对应一个信号量。首先,发送一个GPRS初始化信号,启动GPRS初始化,如果GPRS初始化成功,则发送一个GPRS连接网络的信号量,启动GPRS连网任务,连网成功之后,再发送一个GPRS信号强度查询信号,启动GPRS信号强度查询信号,GPRS信号好,则可以开始正常的IP包数据传输,这时,开启UART1串口接收和发送任务,等待上位机的IP数据包,如果接收到上位机的IP数据包,则发送一个信号到UART串口接收信号量队列,启动串口接收任务处理,这里只针对功能号0x03和0x10处理,功能号0x10代表用GPRS向客户端寄存器写多个数据IP数据包,功能号0x03代表用GPRS向客户端寄存器读多个寄存器IP包,在收到GPRS IP数据包并做出相应的处理之后,构建相应的GPRS IP数据包回文,并发送一个信号到UART发送信号量队列,启动UART串口发送任务,发送IP数据包回文到PC机上显示。
上位机的IP地址为192.168.0.4,端口号为60055;下位机的IP地址为117.136.31.57,端口号为24256。
整个仿真过程为:1)上位机通过网络调试助手向下位机发送一帧MODBUS构建的写多个寄存器数据帧,如图9所示。其中14和10分别代表设备号和功能号;第1个0001代表写入下位机寄存器的首地址,这个地址是一个虚拟地址,这个虚拟地址与一个下位机的实际地址映射,这样下位机可以很方便地控制IP数据包的存放;第2个0001代表写寄存器的个数;02代表写入寄存器数据字节数,由于寄存器是16位,所以,每个寄存器写入2个字节数据;AA55代表写入数据;EB8E是CRC校验码。2)上位机向下位机发送一帧MODBUS构建的读多个寄存器数据帧,如图10所示。14 03 0001 0001与写多个寄存器MODBUS数据帧对应,后面D70F是CRC校验码,这一步就是要将写入下位机对应寄存器的数据读出来。上位机向下位机发送的MODBUS数据帧在下位机接收数据缓存Buffer中都会以标准的GPRS接收数据帧形式“%IPDATA:<LEN>,“DATA””存放,如图11所示。所有的数据都是以ASIC码形式存储的,前面是包头%IPDATA:<LEN>,存放在双引号中的是上位机发送过来的写多个寄存器的MODBUS数据帧,接收数据正确无误,下位机在接收到GPRS IP数据包之后,返回对应的回文,在图9和图10中可以看到下位机返回的回文,从回文中可以看到,写入下位的数据能够正确的读到上位机显示,整个GPRS通信结果正确无误。
针对GPRS无线通信远程终端I/O口控制问题,提出了一个从硬件设计到软件控制的整体方案。该方案详细分析了GPRS通信协议和GPRS模块控制AT命令,并根据GPRS标准协议规定了GPRS模块和LPC2214之间的GPRS无线通信数据格式,并采用MODBUS协议规范了它们之间的UART串口通信,使得整个设计规范和稳定,最终实现了GPRS远程控制I/O口终端。整个设计稳定、可靠,并且都是按照标准的协议进行通信,而且成本低,能够方便地运用于移动终端设备连网,具有很好的实用性和市场价值。
[1]刘宪鹏,吴长贵,凌筱清.基于GPRS远程显示系统的设计与实现[J].微计算机信息,2011,27(1):124-126.
[2]陈琦,丁天怀,李成,等.基于GPRS/GSM的低功耗无线远程测控终端设计[J].清华大学学报,2009,49(2):223-225.
[3]聂明新,邹宇,莫奎.基于动态IP的GPRS远程监控系统[J].武汉理工大学学报,2011,33(5):685-688.
[4]卢伟,杨建华,袁需尧.基于GPRS的嵌入式数据采集与远传系统[J].微计算机信息,2011,27(1):12-14.