2012-04-03 35 views
3

我正在開發一款嵌入式軟件,它也通過AT協議與調制解調器進行通信。現在我想閱讀郵件,但是我遇到了我的記憶容量問題。這可能是因爲我有多條消息,並且使用AT命令集,我會立即將它們全部返回。我沒有內存容量來存儲它們全部來處理它們(我只有1KB左右)。如何在有限內存的嵌入式系統上使用AT讀取SMS?

在這裏看到的例子: http://www.smssolutions.net/tutorials/gsm/receivesmsat/

我送AT+CMGL="ALL"。然後我回來是這樣的:

+CMGL: 1,"REC UNREAD","+31625",,"07/07/05,09:55:16+08" 
Test message 1 
+CMGL: 2,"REC UNREAD","+31625",,"07/07/05,09:56:03+08" 
Test message 2 

OK 

這裏的問題是,該消息可以包含某些指令,其觸發某些動作,這可能需要一段時間來執行。在此期間,從調制解調器接收數據的緩衝區可能(將)溢出。另一方面,我沒有內存容量來首先將所有消息讀入內存以防止緩衝區溢出,然後從內存中處理它們。

一個替代方案是在讀取一個消息,以AT+CMGR=2,取回只是一個消息:

+CMGL: 2,"REC UNREAD","+31625",,"07/07/05,09:56:03+08" 
Test message 2 

OK 

然而,對於這個工作,我需要知道(在上面的實施例2)的存儲位置。

我的直覺告訴我第一次運行AT+CMGL,解析數據並只保留存儲位置,然後請求和解析(並刪除)他們與AT+CMGR一個接一個。

但是,我想收到第二個意見。我對AT和嵌入式軟件還沒有那麼豐富的經驗,所以我可能忽略了一些東西。

回答

3

發送AT+CMGL="ALL"並將第一條消息保存到返回。忽略所有其他數據,直到收到OK,表示調制解調器已完成。處理第一條消息後,通過發送AT+CMGD=<NUM>(其中是第一條消息的編號)將其刪除。重複。

是的,它有點醜,但它工作正常。

2

有一個未經請求的消息,可以配置爲新收到的SMS消息。查看this question瞭解配置系統的更多信息。

每當你收到+CMTI信息的索引字段(在字符串末尾的數字可以閱讀郵件時,可以使用,只是這個值傳遞給AT+CMGR命令來獲取最新收到的消息。

我將建議刪除舊的(舊的)消息,因爲大多數嵌入式類型的模塊只有非常有限的存儲信息的內存

1

我使用的另一個解決方案發送AT+CPMS讀取SIM卡內部存儲器中存儲了多少消息,內存容量(消息數量)

如果AT+CPMS報告有一條或多條消息在內存中等待,請從位置1開始發送AT+CMGR。您將以一條可以接收和解析的消息(可能位於2或10位)結束。

處理完成後,用AT+CMGD(現在你現在的位置是什麼)刪除它。