本文作為串口編程系列終篇,給出基於西門子 TC35 GSM 模組的短信收發完整實現:硬體介面、AT 指令集、PDU 模式編解碼、VC 串口通訊框架與 UI 交互邏輯。
| 功能 | 指令 | 說明 |
|---|---|---|
| 初始化/格式 | AT+CMGF=1 | 設為 PDU 模式(1=PDU, 0=Text) |
| 短信中心 | AT+CSCA="+8613800531500" | 設定 SMSC 號碼(營運商提供) |
| 查詢中心 | AT+CSCA? | 返回當前 SMSC |
| 新訊息提示 | AT+CNMI=1,1,0,0,1 | 收到短信主動上報 +CMTI: "SM",index |
| 發送短信 | AT+CMGS=<length><CR>> <PDU><Ctrl+Z> | 等待 > 提示符後送 PDU,以 0x1A 結束 |
| 讀取短信 | AT+CMGR=index | 讀取指定位置 PDU 內容 |
| 列出全部 | AT+CMGL=4 | 一次讀出所有短信 |
| 刪除短信 | AT+CMGD=index | 釋放 SIM 卡空間 |
CreateFile/ReadFile/WriteFile 同步 I/O 或 Overlapped 異步 I/O。WaitCommEvent(EV_RXCHAR),組裝完整回應行(以 \r\n 分隔)。SendATCommand(cmd, expectedResp, timeout),支援重試與超時。EncodePDU(phone, text) → hexString / DecodePDU(pdu) → {phone, time, text}。// 介面控件:電話號碼編輯框、內容編輯框、發送/清除按鈕、接收列表框
OnSend():
1. 讀取號碼與內容
2. EncodePDU → hexString
3. SendATCommand("AT+CMGS=" + len, ">")
4. WriteFile(hexString + 0x1A)
5. 等待 "OK"
OnReceiveThread():
循環讀取串口
若收到 +CMTI:"SM",idx → SendATCommand("AT+CMGR="+idx) → DecodePDU → 更新列表
若收到 +CMGS 確認 → 更新發送狀態
AT+CMGS= 後的長度為 PDU 字節數(不含結束符 0x1A)。Data Coding Scheme = 0x08。AT+CMGD 刪除。完整工程包含串口類、PDU 編解碼、指令狀態機、MFC 對話框 UI,可直接作為短信網關、報警通知、遠程控制等項目的通訊核心模組。