泥人SIM800C_mini_V2.0除錯記錄
他山之石(轉載原因,方便下次檢視複習)
轉一
手裡有一塊SIM800C的實驗板,花時間做幾個實驗。
時間:
2018-9-8
條件:
SIM800C實驗板, 1塊; 移動SIM卡,1張; USB轉串列埠線,1根; PC機(含串列埠除錯軟體),1臺; 5V電源,1塊。
準備:
裝上SIM卡,轉接線的串列埠接SIM800C的UART1端,USB口接PC的一個USB端。實驗板施加5V電源。
開機:
上電後,STATUS引腳控制的狀態燈(紅)常亮,說明開機正常。 NETLIGHT引腳控制的指示燈(綠)閃爍,看不出來是否成功註冊。後來重新上電一次,發現閃爍的快了一些,才知道前一次的慢閃爍表示沒有註冊成功。 如果監視串列埠,可發現SIM800C將啟動過程中的狀態通過串列埠傳送出來了:
狀態程式碼 | 註釋 |
---|---|
RDY | 上電過程完成,調變解調器按照固定波特率準備好。 |
+CFUN: 1 | 完整功能 |
+CPIN: READY | 移動終端不用等待任何口令 |
Call Ready | 調變解調器已經上電,號碼簿完成初始化 |
SMS Ready | 調變解調器已經上電,簡訊服務完成初始化 |
串列埠通訊
開啟串列埠除錯助手,設定串列埠號、波特率、校驗位、資料位、停止位。我的設定是:串列埠號:com3,波特率:115200(SIM800C具有波特率自適應功能,波特率是多少應該無所謂),校驗位:NONE,資料位:8,停止位:1。at<回車>,沒有反應。隨機換了幾種波特率,也還是沒有反應。換了一臺機子,恰巧預設的波特率是9600,at<回車>,應答OK。調成其它波特率,不行,說明這塊板子上的SIM800C沒有開啟自適應功能。
AT命令基礎
AT命令不區分大小寫。 AT命令後,必須有回車,否則SIM800C無應答; 傳送命令時,SIM800C先回送收到的命令,再應答。可用ATE0關回顯,用ATE1打開回顯。用ATE0&W(或者ATE1&W)將設定儲存到非易失儲存器,掉電不丟失。 比如:
PC機發送的命令 | SIM800C的應答 | 註釋 |
---|---|---|
at | at | 有回顯功能 |
OK | ||
ATE0 | ATE0 | 關閉回顯的命令 |
OK | ||
AT | 已經不回顯了 | |
OK |
AT命令的入門
PC機發送命令 | SIM800C應答 | 註釋 |
---|---|---|
at | 能收到AT命令嗎 | |
OK | 表明接收到命令 | |
at+gsv | 晶片資訊 | |
SIMCOM_Ltd | 製造商 | |
SIMCOM_SIM800C | 型號 | |
Revision:1418B06SIM800C24 | 版本號 | |
OK | ||
AT+ipr? | 波特率是多少 | |
+IPR: 9600 | 9600 | |
OK | ||
AT+ipr=0 | 設為自適應 | |
OK | 自適應似乎並不適用於各種波特率,我發現至少對9600,38400,115200可用。 |
轉二
一、 指令介紹: 1 +CMGW 將訊息寫入記憶體(Write Message to Memory)。 描述:該指令將一條訊息儲存到記憶體中(SMS-SUBMIT 或 SMSDELIVERS),並返回儲存在記憶體中的位置。輸入的“訊息文字”或 PDU 可以被髮送訊息的指令 +CMSS 使用。 語法格式: 文字模式: (<index> is returned in both cases) AT+CMGW= <oa/da> [,<tooa/toda> [,<stat> ] ] <CR> enter text <ctrl-Z / ESC> PDU模式: AT+CMGW= <length> [,<stat>] <CR> give PDU <ctrl-Z / ESC> 返回訊息格式: +CMGW: <index> 或(如果發生錯誤) +CMS ERROR: <err>
2 +CMSS 傳送儲存的訊息(Send Message From Storage) 描述:該指令傳送儲存在<index>指定位置的訊息。 語法格式: AT+CMSS=<index>[,<da> [,<toda>] ] 返回訊息格式: +CMSS : <mr> 或(如果發生錯誤) +CMS ERROR: <err> 如果通過<da>傳遞了一個新的收件人地址,將會取代已儲存訊息的收件人。
3 引數說明: <oa/da> : 字串,源/終訊息地址。 <tooa/toda> : 源/終地址型別。129表示普通號碼型別,145表示國際號碼型別(自動在號碼前加“+”)。 <stat>: PDU模式為整型(在+CMGW指令中預設為2),文字模式為字串(在+CMGW指令中預設為"STO UNSENT"),標記訊息在記憶體中的狀態,如果 <stat> 被忽略, 被儲存的訊息被認為是要傳送的訊息。 <stat> 的取值: --0: "REC UNREAD" --1: "REC READ" --2: "STO UNSENT" --3: "STO SENT" <length> : 實際資料的位元組長度。
二 實現原理: 基於上面的指令,我們發現可以如下方式提高發送效率——通過+CMGW將要群發的訊息儲存到記憶體中,然後一次呼叫+CMSS將訊息傳送出去,而無須每次傳送重複的PDU資訊,減少了通訊資料。
三 示例:(以下采用java註釋風格進行註釋) AT //測試連線狀態 OK //連線正常 AT+CMGF? //檢視當前工作模式 +CMGF: 1 //文字模式
OK //訊息返回結束 at+cmgf=0; //設定工作模式為PDU模式 OK AT+CMGF? //檢視當前工作模式 +CMGF: 0 //PDU模式
OK AT+CPMS=? //檢視當前首選儲存器 +CPMS: ("SM"),("SM"),("MT")
OK AT+CPMS? //檢視當前儲存器中的訊息 +CPMS: "SM",0,70,"SM",0,70,"MT",0,70 //當前三個儲存器中訊息數均為0
OK AT+CMGW=21 //向記憶體中寫入一條訊息 > 0891683108100005F011000D916831xxxxxxxxFx00000006C8329BFD0E01^Z +CMGW: 1 //訊息儲存成功,其索引<index>為1,記住這個數字,後面要用。
OK AT+CPMS? +CPMS: "SM",1,70,"SM",1,70,"MT",1,70 //當前SM 0儲存器中有一條訊息
OK at+cmss=1,"13xxxxxxxx1",145 //將訊息轉發給13xxxxxxxx1 +CMSS: 232 //傳送成功,並儲存在儲存器中,索引是232
OK at+cmss=1,"13xxxxxxxx2",129 //將訊息轉發給13xxxxxxxx2 +CMSS: 233
OK //結束
不明白的地方
AT+CMGS="1000" > 1000 +CMGS: 30 OK |
稍等片刻,在簡訊成功傳送後,模組返回如: +CMGS: 30,的確認資訊,表示簡訊成功傳送,其中 30 為模組內部的簡訊計數器,一般不用理會。