我正在开发一种嵌入式软件,它还通过AT协议与调制解调器通信。现在我想阅读消息,但我遇到了我的内存容量问题。可能是我有多条消息,并且使用AT命令集,我会立即返回它们。我没有足够的内存容量来存储它们(我只有1KB左右)。
请参阅此处的示例: http://www.smssolutions.net/tutorials/gsm/receivesmsat/
我发送AT+CMGL="ALL"
。然后我回来了:
+CMGL: 1,"REC UNREAD","+31625012354",,"07/07/05,09:55:16+08"
Test message 1
+CMGL: 2,"REC UNREAD","+31625012354",,"07/07/05,09:56:03+08"
Test message 2
OK
这里的问题是消息可能包含某些指令,这些指令会触发某些操作,这些操作可能需要一段时间才能执行。在此期间,用于从调制解调器接收数据的缓冲区可以(将)溢出。另一方面,我没有内存容量来首先将所有消息读入内存以防止缓冲区溢出,然后从内存中处理它们。
另一种方法是使用AT+CMGR=2
读取单个消息,只返回一条消息:
+CMGL: 2,"REC UNREAD","+31625012354",,"07/07/05,09:56:03+08"
Test message 2
OK
但是,要实现这一点,我需要知道存储位置(上例中为2)。
我的直觉告诉我先运行AT+CMGL
,解析数据并仅保留存储位置,然后使用AT+CMGR
逐个请求和解析(并删除)它们。
但是,我想收到第二个意见。我不熟悉AT或嵌入式软件,所以也许我忽略了一些东西。
答案 0 :(得分:3)
发送AT+CMGL="ALL"
并将第一条消息保存至返回。忽略所有其他数据,直到收到OK
,表示调制解调器已完成。处理完第一条消息后,通过发送AT+CMGD=<NUM>
(其中第一条消息的编号)删除它。重复。
是的,它有点难看,但效果很好。
答案 1 :(得分:2)
可以为新接收的SMS消息配置未经请求的消息。有关配置系统的更多信息,请查看this question。
每当收到+CMTI
消息时,索引字段(在读取消息时可以使用字符串末尾的数字,只需将此值传递给AT+CMGR
命令即可获得最新的消息消息。
我建议删除旧的(使用过的)消息,因为大多数嵌入式模块只有非常有限的内存来存储消息。
答案 2 :(得分:1)
我使用的另一种解决方案。发送AT+CPMS
以读取SIM内部存储器中存储的消息数量以及内存的容量(消息数)。
如果AT+CPMS
报告内存中有一条或多条消息在等待,请从位置1开始发送AT+CMGR
。您将收到一条消息(可能在第2或第10位),您可以收到和解析。
处理后,用AT+CMGD
删除它(现在你现在的位置是什么)。