打印

设置AT+CNMI=2,2,0,0,0;有关串口对新短消息的判断如何实现?

[复制链接]
6347|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
henhen|  楼主 | 2008-8-2 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   对GSM模块而言,设置设置AT+CNMI=2,2,0,0,0;即有新消息来主动提示,而且是在串口数据线处于空闲的状态中。

   系统用一个串口来实现。发送和接收全部为中断方式处理数据。

   在串口通信中做了超时处理,等于发送完AT指令后,启动100ms的超时应答,如果在100ms内没有得到正确的应答消息。则把串口接收数据长度变量recv_count清0。

   现在矛盾出现了,如果我发送消息,有了应答,但应答不是OK的,也不一定是ERROR,特别是信息发送成功或者错误。如果GSM模块在100ms内已经回了应答,但不是OK应答——我认为GSM处理还没有完成,我还一直在等100ms超时应答,这时候串口数据线空闲了,GSM有新消息来提示我——在这100ms内。我因为在等上一个AT命令的ACK,导致在100ms应答超时内,把接收缓存里的数据区全部清除掉。新消息提示我被清除了。

相关帖子

沙发
henhen|  楼主 | 2008-8-2 22:37 | 只看该作者

我刚提的问题,大家在处理的时候一般该怎么做?

另外发现AT指令的应答千奇百怪,长度不固定,0X0A,0X0D又不是一个,所以很难有一个好的方法来对其接受进行处理。


处理AT指令真的很烦琐,特别针对应答数据!

使用特权

评论回复
板凳
chunyang| | 2008-8-3 11:15 | 只看该作者

说明你还没有掌握AT指令的应答规律

0d0a是关键,程序要记录其数量,再往前推知信息内容。

使用特权

评论回复
地板
henhen|  楼主 | 2008-8-3 14:30 | 只看该作者

楼上的你能否针对我发表的第一个问题提出意见?

使用特权

评论回复
5
chunyang| | 2008-8-3 16:24 | 只看该作者

意见是:通讯程序是根本不能那么写的

    不应该有什么“空闲”不“空闲”之分,将串口接收到的数据压入一个缓冲栈,不能漏掉一个字节,然后由专门的函数/程序块根据索引值或标志启动分析,中断程序仅负责压栈和递加索引,必要时设置一下标志。不过这样的程序设计思想不是几句话可以让初学者弄明白的,需要循序渐进,不妨思考一下日常生活中人对各种信息交流的反应,其中的逻辑完全适用于编程思想。

使用特权

评论回复
6
McuPlayer| | 2008-8-3 17:04 | 只看该作者

把短平快的思想移植到编程中去了

数据丢那么快干什么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝