| 
                      
   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] 下一页 
	             |