手機發短信常用AT指令

注:來自網絡

 

實用的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章