程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 通過串口實時接收短消息(上)

通過串口實時接收短消息(上)

編輯:vc教程

  一年前本人曾寫過“通過串口收發短消息(上)、(下)”兩篇文章,討論了在TE(PC、單片機系統等)上利用擴展的AT指令控制ME(手機,GSM模塊等)發送和接收短消息的基本方法。其中接收/閱讀短消息采用主動查詢的方法。TE發送“AT+CMGL”指令,ME則輸出已接收和存儲的短消息。這比較符合AT指令集的精神:有問有答,一問一答。但在實際應用中,發現這種方法存在一定的缺點:

  ME接收到消息並存儲起來,待查詢時再傳輸到TE,中間總會有一段時間的延遲。這個延遲取決於查詢間隔。

  發出該指令後,不論ME裡有沒有,有多少條消息,總要經過長時間的延遲TE才能收到最終的“OK”。完整的過程一般持續5-10秒。

  本文介紹一種通過串口“實時”接收短消息的方法。當ME收到一條消息時,主動發出通知給TE,或者直接將消息轉發到TE。與查詢機制相比,它類似於中斷機制。

  先簡要說明一下短消息類(class)的概念:根據指定儲存的位置,短消息分為class 0 – 3四個類。也可以不指定類(no class),由ME按默認設置進行處理,存儲到內存或者SIM卡中。在TPDU的TP-DCS字節中,當bit7-bit4為00x1, 01x1, 1111時,bit1-bit0指出消息所屬類:

00 – class 0:只顯示,不儲存
01 – class 1:儲存在ME內存中
02 – class 2:儲存在SIM卡中
03 – class 3:直接傳輸到TE
  GSM Modem一般都支持一條“AT+CNMI”指令,可用於設定當有某類短消息到達時,如何處置它:只儲存在指定的內存(易失的/非易失的)中,先儲存後通知TE,還是直接轉發到TE,等等。

  “AT+CNMI”指令語法為

AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]]
  mode - 通知方式:

0 – 不通知TE。
1 – 只在數據線空閒的情況下,通知TE;否則不通知TE。
2 – 通知TE。在數據線被占用的情況下,先緩沖起來,待數據線空閒,再行通知。
3 – 通知TE。在數據線被占用的情況下,通知混合在數據中一起傳輸。
  mt - 消息儲存或直接轉發到TE:

0 – 儲存到默認的內存位置(包括class 3)
1 – 儲存到默認的內存位置,並且向TE發出通知(包括class 3)
2 – 對於class 2,儲存到SIM卡,並且向TE發出通知;對於其它class,直接將消息轉發到 TE
3 – 對於class 3,直接將消息轉發到 TE;對於其它class,同mt=1
  bm, ds, bfr的含義,請參考相關標准文檔。一般不需要去關心它們。

  在程序中具體實現時,使用mode=2, mt=1,比較簡單。對所有類型的短消息,只要在收到ME送來的“+CMTI”通知後,用“AT+CMGR”指令讀取消息內容就行了。TE與ME之間的通信過程,舉例如下:

(初始化)
AT+CNMI=? (查看能支持的設置范圍)
+CNMI: (0-2),(0-3),(0,2,3),(0,1),(0,1)
OK
AT+CNMI?  (查看當前設置)
+CNMI: 0,0,0,0,0   
OK
AT+CNMI=2,1  (設置為mode=2, mt=1)
OK
AT+CNMI?  (再查看當前設置)
+CNMI: 2,1,0,0,0   
OK
(過了一段時間,有一條消息到達)
+CMTI “ME”,8   (通知:消息已經存儲在ME內存中,序號為8)
AT+CMGR=8  (讀第8條消息)
+CMGR: 8,27
0891683108200505F0240D91683158812764F80000402052110373800741E19058341E01
OK
AT+CMGD=8  (刪除第8條消息)
OK
  還有一種方式mode=2, mt=2也很令人感興趣。在這種方式下,除了class 2外,消息不存儲,直接轉發到TE。需要處理消息通知和內容兩種情況,復雜一些。但如果發送方也由程序控制,可以只發no class或class 1的消息,這樣不存儲在接收方ME內存(一般是閃存,非易失性的)中,肯定能延長它的使用壽命。TE與ME之間的通信過程,舉例如下:

AT+CNMI=2,2 (設置為mode=2, mt=2)
OK
(過了一段時間,有一條消息到達)
+CMT: ,26
0891683108200505F0040D91683158812764F8000840205211639180064F60597D0021

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved