因工作接觸到GSM模塊,所以收集整理了一下關於操作GSM模塊的AT命令的資料:
1.AT的歷史與應用
1.1 AT的歷史
AT命令集是由撥號調制解調器(MODEM)的發明者賀氏公司(Hayes)為了控制Modem發明的控制協議.AT是Attention的縮寫,
協議本身采用文本.每個命令均以AT打頭,因此得名.這段歷史參見 http://en.wikipedia.org/wiki/Hayes_command_set
隨着網絡升級為寬帶,速度很低撥號MODEM基本已經退出一般使用市場.我最近一次看見使用撥號MODEM的地方是深圳市的
網絡報稅系統.必要撥號到稅務局的服務器才能使用。也就在這個很小的市場才留到一點空間。其余一般都用上ADSL的
modem了。
賀氏公司象很多發明偉大的產品的公司一樣,在發明了划時代的MODEM產品后,沒有進一步升級技術。現在已經於1999
年破產消失了,類似的例子有發明瀏覽器的Netscape,第一個成為網絡操作系統的Novell公司,現在都已經邊緣化了。
關於Hayes的破產,還能找到一個舊聞http://news.sina.com.cn/richtalk/news/tech/9901/010704.html
但是有意思,http://www.hayes.com仍在銷售產品,難到又活過來了?
但是AT命令保留下來了。主要的移動電話生產廠商諾基亞、愛立信、摩托羅拉和HP共同為GSM 研制了一整套AT指令,用
於控制手機GSM模塊。其中就包括對SMS的控制。AT指令在此基礎上演化並被加入GSM 07.05標准以及現在的GSM07.07
標准。
在隨后的GPRS控制,3G模塊,以及工業上常用的PDU,均采用AT命令集來控制,這樣AT命令實際在這一些產品上成為事
實的標准。
1.2 AT的優點。
命令簡單易懂,並且采用標准串口來收發AT命令,這樣對設備控制大大簡化了,轉換成簡單串口編程了。
AT命令提供了一組標准的硬件接口--串口。這個簡化的硬件設計.較新的電信網絡模塊,幾乎都采用串口硬件接口。
AT命令功能較全,可以通過一組命令完成設備的控制,完成呼叫、短信、電話本、數據業務、傳真.
1.3 AT命令與ppp協議的關系
在數據通訊的應用中,比如說無線撥號上網。除了AT命令,還會常聽到另外一個網絡協議ppp(Point to Point
Protocol)。
在應用串口通訊的場合,我們可以從硬件上明確看到分為兩大塊。
DTE(Data Terminal Equipment)數據終端設備。通常是一個智能設備,如PC機,嵌入式主機等,用於發送AT命令和
PPP命令,
還有用於鏈路通訊的DCE(Data Circuit Terminal )數據電路終端。用於與外界建立通訊的鏈路。
DTE與DCE之間用串口相連。比如PC機用串口接入撥號MODEM時,PC機是DTE,撥號MODEM是DCE.
AT和PPP的相同點都是由DTE發送給DCE的協議。不同點是AT只用於DTE來控制DCE。比如初始化設備,用於發送呼叫,發
送短消息等,雖然AT有規范,但是大部分DTE產商都擴展了一些AT命令。
而PPP是用於數據通訊,是DTE與遠程的接入服務器(Access Server)進行通訊的協議。是屬於網絡通訊的數據鏈路層協
議,DCE本身收到PPP包時,除了將其調制到物理層上發送到遠端服務器外,本身並不處理PPP的內容。
2.AT的命令格式
AT指令格式:AT指令都以”AT”開頭,以<CR>(即\r,回車符)結束,模塊運行后,串口默認的設置為:8位數據位、1位
停止位、無奇偶校驗位、硬件流控制(CTS/RTS).
注意為了發送AT命令,最后還要加上<LF> (即\n,換行符)這是串口終端要求.
有一些命令后面可以加額外信息來.如電話號碼
每個AT命令執行后,通常DCE都給狀態值,用於判斷命令執行的結果.
AT返回狀態包括三種情況 OK,ERROR,和命令相關的錯誤原因字符串.返回狀態前后都有一個<CR>字符.
如 <CR>OK<CR> 表示AT命令執行成功.
<CR>ERROR<CR> 表示AT命令執行失敗
<CR>NO DIAL TONE<CR> 只出現在ATD命令返回狀態中,表示沒有撥號音,這類返回狀態要查命令手冊
還有一些命令本身是要向DCE查詢數據,數據返回時,一般是+打頭命令.返回格式
<CR>+命令:命令結果<CR>
如:AT+CMGR=8 (獲取第8條信息)
返回 +CMGR: "REC UNREAD","+8613508485560",,"01/07/16,15:37:28+32",Once more
3.DCE的狀態切換與AT的命令撥號流程
這兩個協議都是DTE通過串口發往DCE。那DCE是如何區別是AT命令,如何區別PPP協議包?大部分DCE是采用分時段傳送
的,兩個協議並不同時發送。但是可以通過AT命令兩個專用命令來用切換是AT命令時段,還是PPP協議時段。
在發送AT命令時稱為命令狀態,在發送PPP包時或者語音通訊時稱為數據狀態。
在modem設備啟動進,默認進入AT命令接收狀態,用ATDn ;命令撥出電話號碼n(語音撥號);ATDn 撥出電話號碼n(數
據撥號),兩者區別在於前者有一個分號。用數據撥號撥通后,將進入PPP交互狀態。當需要切回接收AT命令狀態,DTE
需要發送+++命令給DCE.讓其保持在線的狀態時,但接收是AT命令.如果此時需要切斷鏈接,此時發送ATH掛斷命令.
注意發送+++需要前后各一秒的時間。否則會當成數據發送出去。
ATO則是把在線命令狀切換到數據接收狀態。
一個DCE的撥號流程是
3.1.初始化DCE的Modem設備
主要DTE要配置好串口參數,並且向設備發送一些AT命令來進行初始化設置
行軟復位的需執行”ATZ\r”命令;
禁止命令回顯需執行”ATE0\r”命令;
要使返回結果碼為數字形式則要執行”ATV0\r”;
需要設置S 寄存器的需執行”ATSn=X\r”等等。
3.2 撥號連接
AT撥號連接分語音撥號連接和數據撥好連接。語音撥號命令為”ATDn;\r”(注意帶分號);數據撥號命令為”ATDn\r
”(注意不帶分號)。連接成功返回”\r\nCONNECTXXXX/RLP\r\n”,其中XXXX 表示連接速率。在這里我們只討論數據撥
號連接。要注意的是撥號連接需要一定的時間,編程時要根據實際情況進行適當的延時等待。
3.3 數據傳輸及處理
在建立起連接后用戶就可通過DCE進行數據發送、接收及數據處理操作。這時發送數據就是簡單的寫串口,收數據
是讀串口,即使數據中含有AT 命令字符串DCE也不會對其進行處理。此時進行PPP撥號處理流程了。
3.4 從數據狀態切換至在線命令狀態
數據收發結束后,就要使DCE從數據狀態切換至在線命令狀態。向DCE發送換碼序列命令”+++”,並且前后各有至少
一秒的延遲(不向TC35 發數據),可使DCE從數據狀態切換至在線命令狀態,否則DEC會將”+++”當作數據發送出去。
在離線命令狀態時發送”ATO\r”可回到數據狀態。
3.5 掛斷連接
掛斷連接(即掛機)是向DCE發送”ATH\r”
4.常用AT命令
不同產商的AT命令大同小異,但是還是有所區別,一般要看產品手冊,如下列產商的
西門子 TC35i 的 http://www.sendsms.cn/download/TC35i_AT_C.pdf
Nokia的 http://wiki.forum.nokia.com/index.php/AT_Commands
華為CM300 http://www.sangrong.com/download/cm300.pdf
這里羅列一些常見的AT命令
4.1 基本操作
1.1 AT
命令解釋:檢測Module與串口是否連通,能否接收AT命令;
命令格式:AT<CR>
命令返回:OK (與串口通信正常)(無返回,與串口通信未連通)
1.2 AT+CSQ
命令解釋:檢查網絡信號強度和SIM卡情況
命令格式:AT+CSQ<CR>
命令返回:+CSQ: **,##
其中**應在10到31之間,數值越大表明信號質量越好,##應為99。
否則應檢查天線或SIM卡是否正確安裝
測試結果:AT+CSQ<CR>
+CSQ: 31, 99
信號強度值會有少許變化,用手遮住天線,信號強度值會下降(大致在26左右)。
1.3 ATZ
命令解釋:恢復原廠設置
命令格式:ATZ<CR>
命令返回:OK
1.4 AT+CGMR
命令解釋:查詢模塊版本;
命令格式:AT+CGMR<CR>
命令返回: <revision >
+CMEERROR <err>
測試結果:AT+CGMR<CR>
R4A021 CXC1122528
OK
解釋:模塊版本號為R4A021
1.5 AT+IPR
命令解釋:修改串口1波特率;
命令格式:AT+IPR=<value ><CR>
命令返回: ERROR
OK
測試結果:AT+IPR=19200<CR>
OK
注意:串口波特率修改為19200后要把串口調試工具的波特率設為相應
波特率后模塊才會有返回
1.6 AT&W
命令解釋:保存模塊設置;
命令格式:AT&W<CR>
命令返回: OK
ERROR(保存不成功)
測試結果:AT&W <CR>
OK
4.2、通話操作
2.1ATD
命令解釋:撥打電話
命令格式:ATD**********;<CR>(****為電話號碼)
命令返回:OK
NO DIAL TONE(沒有撥號音)
NO CARRIER(無載波)
測試結果:a. ATD13510090403;<CR>
OK
呼叫成功;
b. ATD13510090403;<CR>
NO DIAL TONE
天線未接好,接觸不良;
c. ATD13510090403<CR>
NO CARRIER
命令錯誤,缺{;};
2.2 RING
命令解釋:有電話呼入
命令格式:
命令返回:無
2.3 ATA
命令解釋:摘機
命令格式:ATA<CR>
命令返回:OK
測試結果:RING
RING
ATA<CR>
OK
接通電話;
2.4 ATH
命令解釋:掛機
命令格式:ATH<CR>
命令返回:OK
測試結果:ATH<CR>
OK
電話掛斷(通話過程中);
2.5 AT+CHUP
命令解釋:掛機
命令格式:AT+CHUP<CR>
命令返回:OK
測試結果:RING
ATH<CR>
OK
電話掛斷(尚未接通來電);
2.6AT+VTS
命令解釋:撥打分機
命令格式:AT+VTS=“分機號碼”<CR>
命令返回:OK
測試結果:
AT+VTS=“0”<CR>
OK
4.3、短信息操作
短信操作步驟及相關命令:
(1) 設置短信格式——AT+CMGF
(2) 設置短信存儲載體——AT+CPMS
(3) 設置短信接收提示方式——AT+CNMI
(4) 發送短信——AT+CMGS
(5) 顯示短信——AT+CMGL
3.1 AT+CPMS
命令解釋:選擇短信存儲載體
3.1.1命令格式:AT+CPMS=<mem1>[,<mem2>][,<mem3>]
設置短信存儲載體
命令返回:+CPMS:<used1>,<total1>,<used2>,<total2>,<used3>,<total3>
OK
ERROR
測試結果:a. AT+CPMS=”SM”
+CPMS: 8,15,8,15,1,40
OK
設置成功,並顯示狀態:SM(SIM卡)存儲器總容量為15,當前存儲量8;
ME(模塊)存儲器總容量為40,當前存儲量1;mem1定義為SM;
b. AT+CPMS=”SM”,”SM”
+CPMS: 8,15,8,15,1,40
OK
設置成功,並顯示狀態:SM存儲器總容量為15,當前存儲量8;
ME存儲器總容量為40,當前存儲量1;mem1定義為SM;mem2
定義為SM;
c. AT+CPMS=”SM”,”SM”,”SM”
+CPMS: 8,15,8,15,8,15
OK
設置成功,並顯示狀態:SM存儲器總容量為15,當前存儲量8;
ME存儲器總容量為40,當前存儲量1;mem1定義為SM;mem2
定義為SM;mem3定義為SM;
d. AT+CPMS=”ME”,”SM”,”SM”
+CPMS: 1,40,8,15,8,15
OK
設置成功,並顯示狀態:SM存儲器總容量為15,當前存儲量8;
ME存儲器總容量為40,當前存儲量1;mem1定義為ME;mem2
定義為SM;mem3定義為SM;
e. AT+CPMS=”ME”,”SM”,”ME”
+CPMS: 1,40,8,15,1,40
OK
設置成功,並顯示狀態:SM存儲器總容量為15,當前存儲量8;
ME存儲器總容量為40,當前存儲量1;mem1定義為ME;mem2
定義為SM;mem3定義為ME;
f. AT+CPMS=”ME
ERROR
命令格式錯誤,缺少{”};
3.1.2命令格式:AT+CPMS?
顯示當前短信存儲載體設置
命令返回:+CPMS:<mem1>,<used1>,<total1>,<mem1>,<used2>,<total2>,
<mem1>,<used3>,<total3>
OK
ERROR
測試結果:a. AT+CPMS?
+CPMS: "SM",8,15,"SM",8,15,"ME",1,40
OK
當前短信存儲載體設置為:mem1為SM,mem2為SM,mem3
為ME;
b. AT+CPMS!
ERROR
命令錯誤;
3.1.3命令格式:AT+CPMS=?
顯示本命令支持的參數
命令返回:+CPMS: (list of supported<mem1>s),(list of supported<mem2>s),
(list of supported<mem3>s)
OK
ERROR
測試結果:AT+CPMS=?
+CPMS: ("ME","SM"),("ME","SM"),("ME","SM")
OK
3.2 AT+CMGF
命令解釋:設置短信格式
3.2.1命令格式:AT+CMGF=<mode>
命令返回:OK
ERROR
設置短信格式
3.2.2命令格式:AT+CMGF=?
命令返回:OK
ERROR
顯示本命令支持的參數
3.2.3命令格式:AT+CMGF?
命令返回:OK
ERROR
顯示當前短信格式
測試結果:AT+CMGF=?
+CMGF: (0,1)
OK
AT+CMGF?
+CMGF: 0
OK
AT+CMGF=1
OK
AT+CMGF?
+CMGF: 1
OK
3.3 AT+CMGS
命令解釋:發送短信
命令格式:AT+CMGS=<da>[,<toda>]<CR>
Text is entered<ctrl-z/ESC>
命令返回:+CMGS:<mr>[,<scts>]
+CMS ERROR:<err>
OK
ERROR
測試結果:a. AT+CMGS=13510090403<CR>
>ABCD1234.456<ctrl-z>
+CMS ERROR:500
命令錯誤;
b. AT+CMGS="13510090403"<CR>
> IT IS TEST NOW<ctrl-z>
+CMGS: 235
OK
3.4 AT+CMGR
命令解釋:讀短信
命令格式:AT+CMGR=<indes>
命令返回:+CMGS:<stat>,[<alpha>],<length>]<CR><LF><pdu>
+CMS ERROR:<err>
OK
ERROR
測試結果:a. AT+CMGR=5
+CMS ERROR:500
命令錯誤,5號短信位置為空;
b. AT+CMGR=2
+CMGL: 2,"REC READ","+8613682326205","N?R","03/08/28 17:30:35+00"
998B76844F60002E518D5FCD5FCD5427+CMGS: 235
OK
讀出2號短信;
3.5 AT+CMGW
命令解釋:寫短信,並保存到存儲載體
命令格式:AT+CMGW=<length>[,<stat>]<CR>
命令返回:+CMGS:<index>
+CMS ERROR:<err>
OK
ERROR
測試結果:AT+CMGW="13534139079"<CR>
> SHELLEY123456<ctrl-z>
+CMGW: 1
OK
把目標地址為13534139079的短信存入存儲載體,且被分配的地址
為1號短信;
3.6 AT+CMGD
命令解釋:刪除短信
命令格式:AT+CMGD=<index>
命令返回:+CMS ERROR:<err>
OK
ERROR
測試結果:AT+CMGD=1
OK
1號短信被刪除;
3.7 AT+CMGL
命令解釋:顯示短信清單
命令格式:AT+CMGL=<stat>
命令返回:+CMGL:<index1>,<stat>,<oa/da>,[<alpha>],[<scts>] [,<tooa/toda>,<length>]
<CR><LF><data>[<CR><LF>
測試結果:見總測試結果;
3.8 AT+CMSS
命令解釋:發送存儲載體中的短信
命令格式:AT+CMSS=<index>
命令返回:+CMSS:<mr>
+CMS ERROR:<err>
OK
ERROR
測試結果:AT+CMSS=2
+CMSS: 204
OK
3.9AT+CNMI
命令解釋:新短信提示
3.9.1命令格式:AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>]]]]
命令返回:OK
ERROR
測試結果:AT+CNMI=3,2
OK
3.9.2命令格式:AT+CNMI?
命令返回:+CNMI:<mode>,<mt>,<bm>,<ds>
OK
ERROR
測試結果:AT+CNMI?
+CNMI: 3,2,0,0
OK
3.9.3命令格式:AT+CNMI=?
命令返回:+CNMI:(list of supported<mode>s), (list of supported<mt>s), (list of supported<bm>s),
(list of supported<ds>s)
OK
ERROR
測試結果:AT+CNMI=3,2
OK
4.4、語音部分:
4.1 AT*E2EAMS
命令解釋:設定音頻工作參數(修改語音通道)
4.1.1 命令格式:AT*E2EAMS=<OP >,<NUM >,<VAL >
命令返回:OK
ERROR
測試結果:<OP>為N在1-20之間,表示設置第N個參數
AT*E2EAMS=9,2(把模塊的語音MIC通道設定為手柄)
OK
AT*E2EAMS=10,2(把模塊的語音SPK通道設定為手柄)
OK
<OP >為0表示設置所有參數
AT*E2EAMS=0,2,1,2,0,0,2,5,9,2,2,0,1,0,0,0,1,1,0,0,1
OK
<OP >為255表示要保存設置
AT*E2EAMS=255
OK
4.5、GPS接口:
5.1 AT*EENMEA
命令解釋:設定GPS數據使能
命令格式:AT*EENMEA=<val >
命令返回:OK
ERROR
測試結果:
AT*EENMEA=0 (不接受串口2發來的NMEA數據)
OK
AT*EENMEA=2 (接受來自串口2的NMEA數據)
OK
5.2 AT*E2NMPR
命令解釋:設定串口2發送GPS數據的波特率
5.2.1命令格式:AT*E2NMPR=<val >
命令返回:OK
ERROR
測試結果:AT+CNMI=5 (設定串口2的波特率為19200)
OK
另外是一些常用的網絡命令,也就是GPRS網絡操作的命令如下,
1、AT+CIPSEND=(通過gprs網絡發送數據指令) 等號后面跟發送數據長度,返回〉號后可以填寫數據,達到規定數據量自動發送,也支持無規定數據量的發送,發送成功返回SEND OK,不成功返回SEND FAIL,也可能不返回東東;
2、AT+CIPSTART="TCP","192.43.10.157","4005"(gprs撥號連線) 正確返回OK,錯誤ERROR,格式錯誤,連上線返回CONNECT OK,連線失敗返回CONNECT FAIL;格式能看懂吧應該;
3、AT+CIPSTATUS(查詢模塊gprs狀態) 模塊返回STATE: CONNECT OK(在線),STATE: IP IND(連線失敗,接受場景配置),STATE: IP CLOSED(對方掉線或斷開連接了),STATE: PDP DEACT(連接斷開,你應該檢查一下你的天線了),STATE: TCP CONNECTING(正在連接,這種情況下一般都連接失敗,所以就直接AT+CIPCLOSE,AT+CIPSHUT一起用,然后重連得了,當然我的做法,不一定好),我碰到的只有這幾種狀態,其他狀態沒遇到過;
4、AT+CCLK="07/03/28,06:46:30+00"(給模塊設定時間日期) 格式應該看的懂,正確放回OK,錯誤返回ERROR,格式錯誤;
5、AT+CCLK?(讀取日期時間) 返回+CCLK: "03/01/01,16:07:46+00"之格式的信息;
當然在使用SIMXXX系列的GSM還有其他業務的命令
詳細見:
http://wenku.baidu.com/link?url=Ei-QBjtDdkoSPWx9pYgicQ89_mGmu9EiL3zg3Op962Qlwt7CbfpSpS3D3ul3KXdIA04SQAYuMKY5HuNRpnwRbz1NO_zvOSZ8olMUuchK19e