2.2 短消息的发送
对所有需要发送到GSM
Modem的数据,则通过UART1发送缓冲区来完成。具体发送哪些数据(读取/删除短信、下行功率查询、信源信息查询、未读短信查询)或者缓冲区的数据(短消息发送缓冲区、告警上报发送缓冲区)由软件根据相应的状态来选择确定。
3 设计思路的实现
3.1 串口1数据的发送
3.1.1 串口1发送缓冲区的数据结构
串口1是否有数据需要发送,由串口1的发送缓冲区的状态来决定。串口1发送缓冲区的数据结构定义如下:
typedef struct{
unsigned char bStBuf;//bStBuf =
Uart1_TxBuf_Rdy或者=Uart1_TxBuf_Wait或者=Uart1_TxBuf_Empty
unsigned short Index;
unsigned short Len;
char Buf[270];
}Uart1Buf_t;
① bStBuf成员: 串口1发送缓冲区的状态。
② Index成员: 串口1发送数据缓冲区索引。
③ Len成员: 串口1发送数据缓冲区中有效数据的长度。
④ Buf成员: 串口1发送数据缓冲区。
3.1.2 串口1发送缓冲区软件定时器
由于GSM Modem的特性致使串口1不能不间断地发送数据,因此,对串口1的数据发送设定一个软件定时器。软件定时器用于控制GSM
Modem是否可以接收来自串口1的新数据。软件定时器的结构定义如下:
typedef struct{
unsigned char bTimerSt;//软件定时器的状态: Timer_START或Timer_STOP
unsigned int TimerCtn;//软件定时器的计数器
void (*func)(void);//超时后相应的处理功能函数指针
}SOFtTimer_t;
① bTimerSt成员: 用于描述软件定时器的状态。它有2种状态:
◆ Timer_START——开始软件定时器;
◆ Timer_STOP——停止软件定时器。
② TimerCtn成员: 用于描述软件定时器的定时时间。它是一个32位的计数器,硬件定时的基准时间为20
ms(建议设置在前后台系统主程序循环1次需要的时间),因此最大定时时间为20 ms×232=85 899 345.92 s。
③ func成员:
用于描述软件定时器超时需要去处理相应事情的函数。该函数是在定时器中断服务程序下运行的,因此为了减少中断服务程序占用CPU的时间,函数只作简单的状态设置或者清除工作,如函数Clear_Uart1TxbStBuf。
void Clear_Uart1TxbStBuf(void){
Uart1Tx.bStBuf = Uart1_TxBuf_Empty;//设置串口1发送缓冲区为空
……
}
3.1.3 串口1数据发送状态机
串口1发送缓冲区的成员bStBuf有3种状态。
① Uart1_TxBuf_Rdy: 串口1发送缓冲区数据准备好。
② Uart1_TxBuf_Wait: 串口1发送缓冲区数据等待。
③ Uart1_TxBuf_Empty: 串口1发送缓冲区空。
3种状态的转移情况如图3所示。
图3 串口1的发送缓冲区状态机
当串口1发送缓冲区在Uart1_TxBuf_Rdy状态下时,软件可以向串口的发送缓冲区中写入数据。写入数据后,串口1发送缓冲区的状态将转移到Uart1_TxBuf_Rdy。
在将需要发送的数据拷贝到串口1发送缓冲区后,开启串口1的发送中断,软件将进入串口1的发送中断服务程序。这个中断服务程序将检测串口1发送缓冲区的状态。如果状态为Uart1_TxBuf_Rdy,则说明串口1发送缓冲区中有数据需要发送,这时串口1缓冲区的数据通过串口1的发送中断把所有的数据发送给GSM
Modem。当数据发送完毕后,串口1发送缓冲区的状态将转移到Uart1_TxBuf_Wait状态,否则,将维持当前的状态。
当串口1发送缓冲区的状态在Uart1_TxBuf_Wait状态时,它可以有两条路径让串口1发送缓冲区的状态转移到Uart1_TxBuf_Empty:
其一是串口1软件定时器超时。
其二是相应的条件成立。如发送端消息,当软件从串口1的接收缓冲区中解析出“+CMGSn(1≤n≤255)”信息或者发送失败的信息时,串口1发送缓冲区的状态将转移到Uart1_TxBuf_Empty状态,同时停止串口1软件定时器;读短消息收到“+CMGR……”信息。