首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

串口實時接收短訊:AT+CNMI 指令詳解與主動通知機制實作

     編輯:關於VC++

從輪詢到中斷:為什麼需要「實時」接收?

傳統 AT+CMGL 輪詢模式缺點明顯:

  • 延遲不可控:取決於查詢間隔,訊息滯留於 ME(手機/模組)中。
  • 效率低:無論有無訊息,每次查詢耗時 5-10 秒等待 OK。

解決之道:設定 ME 主動通知 TE(PC/單晶片),類比硬體中斷機制。

短訊類別 與 AT+CNMI 核心參數

依 TP-DCS 位元定義 4 類(Class 0-3)及無類別:

類別行為
Class 0僅顯示,不儲存
Class 1儲存於 ME 記憶體
Class 2儲存於 SIM 卡
Class 3直接轉發至 TE

AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]] 關鍵參數:

  • mode(通知方式):0不通知,1空閒才通知,2忙碌緩衝後通知,3混合傳輸。推薦 2。
  • mt(訊息處置):
    • 0:全存預設位置(含 Class 3)。
    • 1:存預設位置並通知 TE(含 Class 3)。推薦 1,配合 AT+CMGR 讀取。
    • 2:Class 2 存 SIM 並通知;其餘直接轉發 TE(不佔用閃存,延長壽命)。
    • 3:Class 3 直接轉發;其餘同 1。

實戰通訊流程範例

方案 A:mode=2, mt=1(通知+讀取,最通用)

AT+CNMI=?          // 查支援範圍
+CNMI: (0-2),(0-3),(0,2,3),(0,1),(0,1)
OK
AT+CNMI=2,1        // 設定 mode=2, mt=1
OK
... 等待訊息 ...
+CMTI: "ME",8      // 收到通知:第 8 條存於 ME
AT+CMGR=8          // 讀取第 8 條
+CMGR: 8,27
0891683108200505F0240D91683158812764F80000402052110373800741E19058341E01  // PDU 內容
OK
AT+CMGD=8          // 刪除釋放空間
OK

方案 B:mode=2, mt=2(直轉模式,省閃存)


AT+CNMI=2,2
OK
... 訊息到達 ...
+CMT: ,26
0891683108200505F0040D91683158812764F8000840205211639180064F60597D0021  // 直接輸出 PDU,無需讀取指令

方案 B 需解析 +CMT 直接輸出的 PDU,處理較複雜;但若發送端可控(只發 Class 1/無類別),則接收端 ME 不寫入閃存,極大延長模組壽命。

程式設計關鍵點

  1. 執行緒/非阻塞讀取串口:持續監聽 +CMTI: 或 +CMT: 非請求結果碼(URC)。
  2. PDU 解碼:將十六進位 PDU 字串解析為發送方號碼、時間戳、編碼方式、訊息本文(UCS2/7-bit)。
  3. 狀態機管理:區分「等待通知」「發送讀取指令」「解析內容」「刪除確認」狀態。
  4. 錯誤重試:通訊失敗時重發 AT+CMGR 或 AT+CNMI 重新同步。

總結

採用 AT+CNMI=2,1 實現「收到通知 → 主動讀取 → 刪除」閉環,是工業級 GSM 模組應用的標準作法;若追求極致可靠性與模組壽命,且雙端可控,mt=2 直轉模式更具優勢。核心在於從輪詢轉向事件驅動,將延遲從「秒級」壓縮至「毫秒級」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved