zoukankan      html  css  js  c++  java
  • 短信猫(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:"开头的一行数据以及下一行数据。

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

  • 相关阅读:
    Excel添加读音(中英均可)
    java随机函数的使用
    Python3基础第六篇:列表生成式
    Python3基础第七篇:异常处理
    Python3基础第八篇:assert断言
    Python3基础第五篇:range()函数
    Python3基础第二篇:不可变序列操作
    Python3基础第十篇:字符串常用操作
    Python3基础第九篇:字符串格式化
    Python3基础第四篇:列表切片
  • 原文地址:https://www.cnblogs.com/dajianshi/p/2882694.html
Copyright © 2011-2022 走看看