4

我正在开发一个嵌入式软件,它也通过 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 和嵌入式软件还没有那么丰富的经验,所以也许我忽略了一些东西。

4

3 回答 3

3

发送AT+CMGL="ALL"并保存第一条消息直到返回。忽略所有其他数据,直到收到OK,表示调制解调器已完成。处理完第一条消息后,通过发送删除AT+CMGD=<NUM>(这里是第一条消息的编号)。重复。

是的,它有点难看,但效果很好。

于 2012-04-03T22:54:13.910 回答
2

可以为新收到的 SMS 消息配置一条未经请求的消息。看看这个问题,了解更多关于配置系统的信息。

每当您收到+CMTI消息时索引字段(字符串末尾的数字可以在阅读消息时使用,只需将此值传递给AT+CMGR命令即可获取最新收到的消息。

我建议删除旧的(使用过的)消息,因为大多数嵌入式模块只有非常有限的内存来存储消息。

于 2012-04-04T06:27:17.307 回答
1

我使用的另一种解决方案。发送AT+CPMS以读取 SIM 内存中存储了多少条消息以及内存的容量(消息数量)是多少。

如果AT+CPMS报告有一条或多条消息在内存中等待,AT+CMGR则从位置 1 开始发送。您将以可以接收和解析的一条消息(可能在位置 2 或 10)结束。

处理后,删除它AT+CMGD(现在你现在它的位置是什么)。

于 2016-12-15T07:59:54.540 回答