单片机路灯控制系统组群控制件 第8页

单片机路灯控制系统组群控制件 第8页
命令帧,T2的大小都应该是一样的,都是利用时间间隙T1发送收方信息帧,延时的时间是相同的。然而,对于T1而言,情况就有所不同,因为下位机模块先发送数据帧时,利用T1的间隙时间上位机模块发送的命令帧可能较少,因此当下位机模块先发送数据帧时所定义的T1应该小于当上位机模块先发送命令帧时所定义的T1,因为当上位机模块先发送命令帧时,利用T1的间隙时间下位机模块发送的数据帧可能比较多。
4 程序的设计
3.41  主函数的设计思路
开机上电后,程序在主函数中运行,单片机和GSM模块分别进行初始化。单片机的初始化包括设置串口工作方式、波特率,并初始化变量参数和标志位。GSM模块初始化包括重新启动、关闭回显、设置在TEXT模式下在返回值中不显示详细的头信息、选择短信格式为TEXT模式、开发串口中断准备接收数据。为了使模块能对返回的参数采取不同步骤,程序设置了可以位寻址的标志位,分布在在单片机89C52的位寻址区2EH和2FH两个字节单元中,如表9所示。  
  表9 标志位列表
标志位 含义 位地址
f_inited 初始化完成 7EH
f_sending 有数据块发送 7CH
f_ack 发确认帧 74H
f_nack 发非确认帧 73H
f_sended 发送成功 79H
f_read_sms 可以阅读短信息 7FH
f_deleting 删除短信息 78H
f_ready 见表5 7AH
f_geti2c 见表5 77H
主函数是一个不断遍历E2PROM寻找需要发送的数据块,和判断是否需要向上位机模块发送应答帧的循环过程。前者是通过不断遍历位寻址区查寻标志位f_sending、f_ack 、f_nack是否被置为1来实现的。后者是当接收到上位机模块的短信数据时所需执行的操作指令。一旦遍历到数据块需要发送,或者实时接收到了上位机模块发送来的短信数据,主函数将快速转到时钟中断服务程序来调用SHELL函数,完成数据块或者应答帧的发送。实际上无论是数据块的发送还是应答帧的发送,都是针对GSM模块不同返回参数的处理过程。另外,主函数在完成单片机和GSM模块的初始化后,将立即开放串口中断,实时接收GSM模块返回的参数以及上位机模块发来的短信数据。
系统运行时,上位机模块首先发送一个应答帧给下位机模块,从而启动下位机模块的运行。应答帧可以是确认帧,也可以是非确认帧,这可以事先约定。程序的开头检验是否收到应答帧,有两个意图。其一,当系统启动时作为下位机模块的启动信号;其二,当下位机模块正常运行时,在发送完短信后,下位机模块需要判断上位机模块是否收到了短信,判断的依据就是上位机模块是否返回应答帧。根据应答帧的内容,下位机模块将决定是继续发送下一帧数据还是重新发送上一帧。按照双方通信约定的协议,如果超过了最大延时T1,下位机模块也将重发上一帧,重发的过程也是时钟中断服务程序调用SHELL函数的过程。
3.42   GSM返回参数的处理-SHELL函数
   SHELL函数是进入时钟中断程序时被调用的,该函数是对GSM模块返回参数进行处理的函数。根据系统设计的要求,需要对GSM模块进行下列操作:呼叫对方模块号码、发送数据、阅读短信、删除短信。基于以上操作指令,如果操作成功GSM模块会分别返回不同的参数:>、+CMGS、+CMGR、OK,根据接收到的不同参数,下位机模块将转向不同的操作步骤,判断并改变标志位的值。比如,如果某时刻接收到>,这表明呼叫对方模块号码获得成功,接下来需要发送数据,这时SHELL函数将检查发送不同数据所代表的标志位f_sending、f_ack、f_nack,从而决定需要发送何种类型的数据。如果f_sending=1,需要发送E2PROM中的某个数据块;如果f_ack=1,需要发送确认帧,告诉对方已经成功接收到了对方发送的数据;如果f_nack=1,需要发送非确认帧,表明本方接收到的数据是错误的,并等待对方重新发送上一帧数据。需要说明的是,在同一时刻这三个标志位只有其中之一等于1,这是双方通信的半双工协议所强行约定的。对于其余三个返回参数,处理思想基本类似,在此不一一罗列。
如果操作失败,模块返回ERROR,也有三种可能的情况,分别是发短信出错、阅读短信出错、删除短信出错。SHELL函数将检查上述操作的标志位是否为1,并根据标志位的情况重新发送该AT指令。
还有一个返回参数比较特殊,即在等待接收返回参数的过程中接收到了+CMTI。这不是本方主动操作获得的返回参数,而是表明上位机模块此刻有短信数据到来。SHELL函数将首先提取短信数据在SIM卡中的存放序号,并将此序号存放到单片机2的指定单元中,然后根据序号发送阅读短信指令。
如果没有接收到任何GSM模块返回的参数,即字符缓冲区中字符个数为0,发生这种情况有两种可能。其一,当单片机和模块初始化完毕后,如果首次遍历E2PROM时发现有数据块需要发送,SHELL函数将会呼叫对方号码,试图建立连接,准备发送数据。因为在呼叫对方号码之前,下位机模块没有进行任何AT指令操作,模块也就不会返回任何参数,这是情况之一。其二,当下位机模块发送完数据块后,在等待对方应答帧的过程中,如果在最大的延时范围内没有收到对方的应答帧,SHELL函数也将会呼叫对方号码,准备重新发送上一数据块,超时重发机制在这里得到了反映。

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有