實用的AT指令
單片機和GSM引擎之間採用AT指令實現互相之間的通訊,因此有必要瞭解一下AT指令的格式和幾條常用的指令。更詳細的資料可以參考GSM07.05和GSM07.07規範。
單片機發出的AT指令用來建立通訊鏈路,AT指令集的命令格式幀都以AT開頭,下面是幾個常用的AT指令。
1.設定短訊息中心
AT+CSCA=“+8613800270500”斷行符號(具體的號碼由當地的電訊廠商決定。)
2.接收短訊息
+CMTI:“SM”,X (X表示接收短訊息的SIM卡儲存號碼)
AT+CMGR=X斷行符號 (從X儲存區讀短訊息)
AT+CMGD=X斷行符號 (從X儲存區刪除短訊息)
3.發送短訊息
AT+CMGF=1斷行符號(採用文字格式設定發送,如用PDU格式,則AT+CMGF=0)
AT+CMGS=“+8613xxxxxxxxx”斷行符號
>輸入短訊息。Crtl+Z結束並發送。
4.重要的指令
ATZ;E 斷行符號 Echo OFF
ATZ;E1斷行符號 Echo ON
AT+CREG?斷行符號 回答x(X=2離網,X=1註冊,X=0狀態不明)
AT+COPS?斷行符號 表示SIM卡是否被網路接受
AT+COPS=?斷行符號 顯示所有可用的網路。
5.建立語音電話
AT+CREG?斷行符號(是否網路註冊)
ATD13xxxxxxxxx;斷行符號(語音電話和資料呼叫建立的區別在於號碼後所接的分號上)
6.改變並儲存參數
AT+IPR=2400 斷行符號(改變RS232口的速率至2400bps)
AT&W 斷行符號 (儲存已改參數)
7.輸入數字 PIN 碼
AT+CPIN=“xxxx”
通訊鏈路建立以後,單片機就可以發出資訊單元幀了,資訊的框架格式如下:
其中標誌幀開始的幀頭為十六進位的10H和02H,標誌資訊結束的是10H和03H,最後二位是資料部分按16位求和以後模數的結果,用做校正位。對於資料位元,為了避免出現錯誤的結束標誌,規定每出現一個10H碼字以後,後面插入一個Null 字元00H。接收端如果收到資訊以後,就要相應地去掉Null 字元。如果接收端收到的資料部分和BCS部分按照16位相加以後的結果不等於0,就表示傳輸出現錯誤,所收到的資訊就要丟掉。
本文以一個執行個體來解說AT指令發送PDU簡訊的全過程,假如我要發送下面的簡訊:
接收號碼:+8613602433649
簡訊內容:工作愉快!
簡訊中心號碼:+8613800200500
一、簡訊中心號碼處理:用字串 addr 表示
1、將簡訊息中心號碼去掉+號,看看長度是否為偶數,如果不是,最後添加F
即 addr = "+8613800200500"
=> addr = "8613800200500F"
2、將奇數位和偶數位交換。
=> addr = "683108020005F0"
3、將簡訊息中心號碼前面加上字元91,91是國際化的意思
=> addr = "91683108020005F0"
4、算出 addr 長度,結果除2,格式化成2位的16進位字串,16 / 2 = 8 => "08"
=> addr = "0891683108020005F0"
二、手機號碼處理:用字串 phone
1、將手機號碼去掉+號,看看長度是否為偶數,如果不是,最後添加F
即 phone = "+8613602433649"
=> phone = "8613602433649F"
2、將手機號碼奇數位和偶數位交換。
=> phone = "683106423346F9"
三、簡訊息部分處理:用字串 msg 表示
1、轉字串轉換為Unicode代碼,例如“工作愉快!”的unicode代碼為 5DE54F5C61095FEBFF01,
(轉換函式見最後附錄)
2、將 msg 長度除2,保留兩位16進位數,即 5DE54F5C61095FEBFF01 = 20 / 2 => "0A",再加上 msg
=> msg = "0A5DE54F5C61095FEBFF01"
四、組合
1、手機號碼前加上字串 11000D91(1100:固定,0D:手機號碼的長度,不算+號,十六進位表示,91:發送到手機為91,發送到小靈通為81),
即 phone = "11000D91" + phone
=> 11000D91683106423346F9
2、手機號碼後加上 000800 和剛才的簡訊息內容,000800也寫死就可以了
即 phone = phone + "000800" + msg
即 11000D91683106423346F9 + 000800 + 0A5DE54F5C61095FEBFF01
=> phone = 11000D91683106423346F90008000A5DE54F5C61095FEBFF01
3、phone 長度除以2,格式化成2位的十進位數
即 11000D91683106423346F90008000A5DE54F5C61095FEBFF01 => 50位 / 2 => 25
五、所以要發送的內容為
AT+CMGF=0 <斷行符號>
OK
AT+CMGS=25<斷行符號>
> addr+phone <Ctrl+Z發送>
六、如果返回不是ERROR,恭喜你,發送成功了^_^