1. 程式人生 > >泥人SIM800C_mini_V2.0除錯記錄

泥人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 為模組內部的簡訊計數器,一般不用理會。