3 软件整体结构
3.1 软件层次结构
程序中的所有代码都是由C语言编写的,并采用分层的结构,从底到上分别为:串口驱动层、GPRS模块驱动层、PPP协议层、IP协议层、UDP 协议层与应用层。上层函数的实现需要应用到底层函数,而底层函数的任务就是为上层函数提供服务,最终完成应用层任务——传送数据。各层的主要函数如图2所示。
3.2 驱动程序编写
首先是串行口驱动层。它实现打开串口(OpenComm)、关闭串口(CloseComm)、读串口数据(ReadComm)、写串口数据(WriteComm)等函数。例如WriteComm函数向串口发送一个字节的数据,而transmit函数向串口发送一个字符串的数据:
void WriteComm(char c) { ES = 0; SBUF = c; while(TI==0); TI=0; ES = 1; }
void transmit (char *data) { Delay (250); while (*data) { WriteComm (*data++); } }
然后,在这些串口函数的基础上编写GPRS模块的驱动函数。微控制器通过串行口控制GPRS模块,进行拨号、设置等操作。控制的方法是采用AT 命令。在控制GPRS模块拨打移动梦网GGSN的登录号码“*99***1#”之后,GPRS模块就转入在线模式(On-Line)。此时微控制器向串行口发送的所有数据都透明地传送给了GGSN,同样GGSN的回答也传回单片机的串行口。当数据传送完成后,微控制器需要通知GPRS模块结束会话,并从在线模式转回普通的命令模式,这可以通过置高DTR线完成。同时,如果线路由于异常断开,CD线会回复到平常的低电平,所以处于在线模式下也要不断检测CD 线是否处于高电平。根据这些操作,可以编写GPRS驱动函数:初始化GPRS模块函数(GPRSInit)、拨号函数(GPRSDial)、断开连接函数 (GPRSHangup)、检测是否处于在线状态函数(GPRSOnline)。其中,GPRS的拨号和挂断代码如下:
BYTE GPRSDial (void) { signed char delayCount = 80; transmit ("ATV0"); // 要求返回数字表示的回答 if (!Waitfor ("0", 30)) { // 等待 OK 回答 return -1; }
DTR_ON;
transmit ("ATD*99***1#"); // 拨GGSN的号码
GPRSBuffFlush (); // 清空buffer
// 等待回答 while ((!GPRSBuffNotEmpty()) && (--delayCount > 0)) { Delay (250); }
共3页: 上一页 [1] 2 [3] 下一页
|