调制解调器接收数据的最佳轮询设计是什么?
我有一个GSM调制解调器连接在我的电脑上,我想用我写的Python程序接收发给它的短信。我在想,检查数据的最佳方法是什么。
我应该写一个程序,让它一直循环,不断检查有没有新的短信吗?也就是说,在这个循环里,程序发送AT命令并读取输入的数据。还是说调制解调器有办法通知应用程序有新数据(短信)到达?
我在想,手机其实就是一个GSM调制解调器,当收到短信时,手机会提醒你这个事件,还是说手机的软件也有一个无限循环在检查有没有新数据?
2 个回答
0
我发现我对和短信相关的AT指令集记得不太清楚。Andre Miller的回答让我想起了一些东西。无论如何,你应该仔细阅读相关文档,我相信里面有一些需要注意的地方。
我建议你每隔至少5秒钟就进行一次轮询,这样做是为了在断开连接时能更稳健和快速地响应。
我使用了一个状态机来在初始化、读取和删除消息之间进行切换。
3
我之前写过类似的东西。其实有一种方法可以通过AT命令告诉调制解调器,每当收到短信时就给你发个信号。
作为参考,我在一个嵌入式应用中使用的是Maestro 100 GSM调制解调器。
首先,你得正确初始化调制解调器。我当时使用的是短信的文本模式,但你可能用的是其他模式。你可以从这些选项中选择你想要的。AT+CNMI是最重要的。
AT&F0 # Restore factory defaults
ATE0 # Disable command echo
AT+CMGF=1 # Set message format to text mode
AT+CNMI=1,1,0,1,0 # Set new message indicator
AT+CPMS="SM","SM","SM" # Set preferred message storage to SIM
然后你需要等待消息通知,通知的格式大概是这样的。(不要根据索引号来匹配,因为不同的通知可能会有不同的索引号)
+CMTI: "SM",0 # Message notification with index
当你收到这个通知时,就可以去获取未读的短信:
AT+CMGL="REC UNREAD" # Retrieve unread messages
我建议你还可以设置一个轮询,可能每5分钟检查一次,以防错过通知。因为串口通信你永远不能完全确定!