如何在内存有限的嵌入式系统上使用AT读取短信?

时间:2012-04-03 21:23:54

标签: memory sms embedded at-command

我正在开发一种嵌入式软件,它还通过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或嵌入式软件,所以也许我忽略了一些东西。

3 个答案:

答案 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删除它(现在你现在的位置是什么)。