注:來自網絡
實用的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碼字以後,後面插入一個空字符00H。接收端如果收到信息以後,就要相應地去掉空字符。如果接收端收到的數據部分和BCS部分按照16位相加以後的結果不等於0,就表示傳輸出現錯誤,所收到的信息就要丟掉。
666
發帖: 932
於2005-04-25 17:45
--------------------------------------------------------------------------------
☆★☆ AT指令發送PDU短信詳解(支持發送到小靈通) ☆★☆
爲了完成公司的短信收發程序,我找遍了所有資料,最後在很多網友的支持下
基本上完成了這個程序,爲了使後來的人免走我同樣的彎路,我將AT指令發送PDU
短信的全過程及函數整理出來,希望能給大家幫助,歡迎大家與我一起探討:
QQ :119547601
E_Mail :[email protected]
我在大富翁上的帖子:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3043115
本文以一個實例來解說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,恭喜你,發送成功了^_^
附錄:
function EncodeUniCode(s:WideString):String; //字符串->PDU
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s[i]);
Result:=Result+IntToHex(Cur,4);
inc(i);
end;
end;
function DecodeUniCode(s:String):WideString; //PDU->字符串
var
p:PWord;
i,len:Integer;
cur:Integer;
TempChar:WideChar;
t:String;
begin
New(p);
Result:='';
len:=Length(s) div 4;
i:=1;
for i:=0 to Len-1 do
begin
t:=Copy(s,4*i+1,4);
p^:=HexToInt(t);
Move(p^,TempChar,2);
Result:=Result+TempChar;
end;
Dispose(p);
end;
歡迎訪問:樂園www.ly8.co