短信猫(GSM Modem)异步处理收发短信的总结

本文详细介绍了如何构建高效的串口通信系统,包括数据缓存、异步接收、AT命令解析及短消息通知机制。重点讨论了如何通过使用StringBuilder进行线程安全的数据缓存操作,以及如何利用DataReceived事件或单独线程轮询来实现异步数据接收。此外,文章还阐述了AT命令同步问题的解决方法,通过MenualResetEvent控制命令结果返回,并在数据解析完成后设置信号量以释放资源。最后,强调了数据解析函数的关键点,如触发时机、数据边界处理和解析方式,确保系统能够准确解析各种类型的通信数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、构建自己的接收数据缓存,异步接收串口返回数据,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:"开头的一行数据以及下一行数据。

最后、未解析出的数据重新放回缓存中,留待下次继续处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值