短信猫(GSM Modem)异步处理收发短信的总结
一、构建自己的接收数据缓存,异步接收串口返回数据,AT命令返回值异步解析:
1,接收数据缓存,我选用的是StringBuilder,看资料其应该是线程安全的,不过好在写入数据在一个线程中,暂时没有发现问题。
2,可以使用DataReceived事件,或是建立单独线程轮询,我选用后者。
3,对于收到的数据,建立单独的解析函数,解析命令结果或者收到的其他信息,如收到短信或来电等。
4,考虑到效率问题和对SIM卡的保护,接收短信息的缓存首选设备(ME)或混合(MT),如果设备不支持才选用SIM卡(SM)
5,短息通知我选择即时通知(AT+CNMI=2,2),不支持则选缓存通知(AT+CNMI=2,1)。
二、AT命令的同步问题:
1,由于命令返回结果是异步接收的,所以我使用MenualResetEvent,控制并等待结果返回。
2,数据解析函数解析出命令结果后,Set信号量,命令发送函数得以继续执行。
三、数据解析函数的关键点:
1、触发数据解析函数的时机:
考虑效率问题,不可能每次收到数据都调用解析函数。分析AT命令结果以及短息通知等数据,我发现绝大多数情况下,这些数据都是以\r\n结尾,所以每当收到\r\n的时候都要调用解析函数;另外还有特殊情况,例如:AT+CMGS和AT+CMGW,这两个命令都要等待">"的出现然后再发送数据,所以当执行这些特殊命令时,就要检测">"的出现。
2、数据边界处理:
主要是,收到的数据没有已\r\n结尾的(除了上面说的">")一定不能参与解析,否则会造成数据不完整。
3、数据解析方式:
首先、按照\r\n拆分所有数据为字符串数组。
其次、根据每种数据的特点,分别解析。比如正在执行AT命令,那么必须收到“ERROR”或“OK"之后,命令的返回就已经完整。再如收到即时短息通知的解析方法:以”+CMT:"开头的一行数据以及下一行数据。
最后、未解析出的数据重新放回缓存中,留待下次继续处理。