[3G/4G]3G/4G模塊開發
轉自:http://mywutuobang.blog.sohu.com/260073467.html
一. 修改內核支持3G模塊,一般內核需要枚舉相關的通訊模塊,其接口為串口,其數據接口和通訊接口枚舉成不同的設備,如果出現問題,詳見以下步驟:
3G 出現問題,通常應先檢查系統是否識別到了 modem 設備,可用如下命令確認:
ls /dev/ttyU*
或者
ls /dev/ttyA*
如果在/dev 下沒有找到 ttyU* 或者 ttyA* 設備,此時可通過觀察內核 LOG 來定位問題:
1. USB 設備枚舉失敗或者系統根本就沒有發現 USB 設備,此時應檢查硬件電路
2. USB 枚舉成功,但沒有註冊到 ttyUSB 或者 ttyACM 設備,此時應檢查你的內核:
a). 你的內核沒有開啟 usb serial 功能
b). 你的內核代碼中的 usb serial 相應驅動中沒有添加該設備的 VID/PID,請修改
kernel/drivers/usb/serial/option.c,在數組 static struct usb_device_id option_ids[] 的末
尾添加上新設備的 VID/PID
3. USB 枚舉成功,且相關配置且 ID 都已添加,但還是不出來 ttyUSB 或者 ttyACM 設備,此時
可觀察系統是否有對它執行 usb mode switch,可通過 logcat:
# logcat –s Vold vold &
觀察是否有調用了 usb_modeswitch 程序,如果沒有執行,則檢查如下:
a). 檢查一些必要的文件是否存在:
ls /system/bin/usb_modeswitch
ls /etc/usb_modeswitch.sh
ls /etc/usb_modeswitch.d/[VID_PID] #[VID_PID]應替換成你的 modem 的
VID/PID,如: 12d1_1001
如果是缺少了 usb_modeswitch、usb_modeswitch.sh 等文件,則可能是你的 福州瑞芯微電子有限公司 福州瑞芯微電子有限公司 福州瑞芯微電子有限公司 福州瑞芯微電子有限公司
gingerbread/device/rockchip/sdkDemo/BoardConfig.mk 中的配置存在問題,請確認
BOARD_RADIO_DATAONLY := true
如果是缺少了/etc/usb_modeswitch.d/[VID_PID],請告知我!
b). VOLD 中關於 usb_modeswitch 這部分的代碼沒有被編譯,你可查看 Vold 的 log 中是
否有“Start Misc devices Manager…”的字樣,如果沒有這串字符,請檢查你的
gingerbread/system/vold/下的內容。
通常,3G 問題中,不出來 ttyUSB 或者 ttyACM 設備,主要就是上述的那些情況 。
二.如果是開發短信功能,需要獲取3G模塊供應商的AT指令集,大部分的3G模塊的指令集一致。
1、先執行AT命令,若返回OK,則說明三級模塊與單片機的串口連接好了;
2、接著執行AT+CFUN=1, 啟動初始化SIM模塊命令,該命令不管有沒有插卡都會返回OK;
3、接下來執行AT+CREG=1,初始化網絡,允許網絡註冊主動提供結果代碼(將<mode>設為了1);理論上可以通過查詢AT+CREG?命令來判斷是否註冊成功,根據返回的指令判斷是否註冊到網絡,返回命令的格式為::+CREG:<mode>,<stat> [,<lac>,<ci>],若<stat>為1(註:由於註冊網絡需要一段時間,所以初始返回值可能為2,即處於未註冊,終端正在搜尋基站,因此需要延時一段時間,供硬件反應),則表示註冊到本地網絡。具體原因參見命令解釋,但是由於不插上SIM卡也可以有返回指令,所以檢測不便,另外硬件需要一段反應時間,從而使得測出來的結果不準確,為此應該使用以下命令。
4、接下來執行AT+COPS?如果返回0,則表示插入了SIM卡,但是此時SIM卡不一定註冊成功,需要延時一段時間,然後再判斷AT+COPS?返回結果,若返回+COPS: 0,0,"中國聯通",0,則還需要判斷AT+CREG?判斷格式是否為+CREG:1.1(主要看第二個參數);若返回+CMEERROR:10,則SIM卡註冊失敗,有可能SIM卡未插入插槽中,此時應該檢測是否將SIM卡插好,確信卡是插好的。因為硬件連接傳輸有可能延遲,應該多試幾次。
通過以上分析,為了簡化判斷程序,可以只判斷AT+COPS?是否能夠返回0,這樣就表示硬件連接上有沒有問題了。
在以上步驟成功後,先執行AT+CMGF=1,設定發送短消息的格式,1代表TEXT,0代表PDU格式。返回OK,則執行成功。接著輸入AT+CMGS=”13988888888”回車(對應的16進制為0x0D),後面的號碼表示發送短消息的目的地號碼。若成功,則會返回一個>符號,提示輸入信息,接著輸入想要發送的信息即可,最後在發送的末尾加上CTRL+Z(對應的16進制為0X1A),則短消息發送成功。
經常涉及的指令:
1、AT+CFUN=1(全功能命令,立即執行)
此命令可以開啟simcom模塊的大部分功能,一般在初始化模塊的時候都要寫上;AT+CFUN=0的功能與+CPOF相同。(AT+CPOF,關機)
2、AT+CREG 網絡註冊和漫遊
AT+CREG=<mode>,命令響應(Response):+CREG:<mode>,<stat> [,<lac>,<ci>]
參數說明:
<mode>
0: 禁止網絡註冊主動提供結果代碼(默認設置)
1: 允許網絡註冊主動提供結果代碼:+CREG:<stat>
2: 啟用網絡註冊和位置信息非請求結果碼+CREG:<stat>[,<lac>,<ci>]
<stat>
0:未註冊,終端當前並未在搜尋新的運營商
1:已註冊本地網絡
2:未註冊,終端正在搜尋基站
4:未知代碼
5:已註冊,處於漫遊狀態
<lac> 位置區編號
<ci>小區ID
註意:當設置AT+CREG成功時調制解調器回復OK.之後將網絡註冊狀態通過響應返回。當網絡註冊狀態發生改變時,調制解調器將狀態通過響應反映上來。
LAC及CI也可以從+CCED命令查詢出來。
3、AT+COPS(運營商選擇)
AT+COPS=? 返回網絡上支持的運營商描述列表,可能的返回結果如下:
+COPS: (2,"中國聯通","CUCC","46001",0),(3,"中國移動","CMCC","46000"),,(0-4),(0-2)
讀指令:AT+COPS? 返回當前選擇的模式和網絡運營商,格式為:+COPS:<mode>[,<format>[,<oper>]]OK
可能的返回結果:+COPS: 0,0,"中國聯通",0
寫指令:AT+COPS=<mode>[,<format>[,<oper>]] 強制選擇和註冊GSM網絡運營商,返回:OK
參數:
<stat> 0 不知道
1 可用的運營商
2 當前運營商
3 禁用的運營商
<oper> 運營商
<mode> 0 自動模式 <oper>被忽略
1 手動選擇
2 從網絡中手動註銷
3 選擇盡有有格式
4 手動或自動選擇,如果手動失敗,則自動使能
<format> 0 支持長字節格式,能升到16字節長
1 短字節格式
2 數字格式,
AT+CREG與AT+COPS結合使用事例:
AT+CREG=1//允許網絡註冊主動提供結果代碼
AT+COPS=0//設置為自動模式
AT+COPS?//查詢當前模式和網絡運營商
4、AT+CSQ(讀取信號強度)
返回+CSQ: 20.0之格式的信息,信號強度
5、AT+CMGF(設置短消息格式)
AT+CMGF=0 選擇PDU格式,=1選擇TEXT格式
6、AT+CMGS(發送短信)
若想發往13508485560,短消息內容為:“test“,則格式如下:
AT+CMGS="13508485560"(目的地址)回車 >test^z ;發送完號碼後回車,符號”>”為系統返回,不是需要輸入的符號。輸入完短信內容後,按Ctrl+Z結束。
另一方面也可以發送命令AT+CMGS=6,即設置發送的短信的長度為6個。
7、AT+CSCA 設置短消息中心
AT+CSCA=“+8613800270500”回車(具體的號碼由當地的運營商決定。其中+861380不變,後四位是地區區號。這裏顯示0270表示地區為武漢,後三位基本不變為500)。
AT+CSCA?可以得到短信中心號碼。
8、AT+CSQ?(查詢信號強度)
三. 發送短信
開發環境是ARM11&linux。例子是飛淩的6410開發板,3G模塊選中興的AD3812,
短信的發送一般分為三種模式:Block Mode, Text Mode和PDUMode,其中blockmode已經很少使用。下面介紹的內容,是在PDUMode下發送和接收短消息的實現方法。text模式發送短信的時候比較簡單,pdu模式相比而言的話要麻煩一下。具體使用那種模式,還要看你的需求,如果所要發送的短信內容全部是英文或者數字的話可以使用text模,如果你發送的短信中含有中文字符或者漢子的話就只能用pdu模式進行發送了。
我做的短信開發,發送的信息包含中文,而且接收的短信命令中也有中文,所以使用的是pdu模式。使用pdu模式發送短信的步驟如下:
(1)串口初始化。
(2)構建SMS的pdu串。
(3)設置短信發送模塊的模式。
(4)使用AT指令發送pdu串到指定的手機號碼。
下面對以上步驟進行詳細的解釋:
(1)串口初始化,串口的初始化要按照短信發送模塊的默認來設置,我所使用的AD3812的說明書上明確指出 :115200,8,N,1,即傳輸速率是115200,數據位是8位,無奇偶校驗位,一位停止位。
(2)構建SMS的pdu串。這一步是整個過程最主要的一步,關系到發送能否成功。首先要知道短信pdu串的組成,sms pdu串主要由9個部分組成,按照順序分別為 SCA(servicecenter adress)服務中心的電話號碼;pdu—type(protocoldata unit type):協議數據但與類型;MR(messagereference) 所有成功的sms—submit參考數目;OA (originatoradress)發送方sme(short-message-entity)的地址;DA(destination)接收方SME的地址;PID(ProtocolIdentifier)參數顯示SMSC以何種方式處理SM;DCS(datacoding scheme)參數表示用戶數據采用什麽編碼方案;SCTS(servicecenter time stamp)smsc接收到消息是的時間戳;UDL,用戶數據長度;UD,用戶要發送信息的內容。
(3)之前已經說過了,使用pdu模式,所以這一步其實就是告訴設備,我們使用的是pdu模式,對用的at指令是:AT+CMGF=0\r.註意:\r表示的是回車,指令後面必須跟有\r設備才能識別。
(4)第1-3搞定之後,剩下的就是告訴設備發送該短信了,具體的命令是AT+CMGS=%d\r,%d是一個正整數,該數的值與你發送短信的內容有關系,%d=15+2*發送的字符數。
現在根據我做的具體來說明過程,希望對你有幫助:
上面已經把我的軟硬件環境說明了,下面重點說明短信的發送過程,我需要發送的短信內容是:江大科茂歡迎您!目的電話號碼是18796082112,我使用是移動的sim卡。最後構建的sms pdu為:0891683108501105F011000D91688197062811F2000800166C5F592779D183026B228FCE60A8FF01
如上所示,其實整個sms pdu構建過程中,需要自己做的只有四處,分別是發送方的短信中心號碼,目的手機號碼,短信內容長度,短信內容的unicode碼。其中紫色的為所在地的短信中心號碼,因為我用的是鎮江移動的號嗎作為發送手機號,所以從網上就可以查到,對應的短信中心號是13800511500,需要按照前後位交換,最後一位補F進行重新排列。3108501105F0。紅色的為目的手機號碼,也需要進行重新排列。綠色的是短信的內容的長度具體計算方法為:短信內容的字符數*2,並要註意要以4位16進制表示。藍色的為短信內容“江大科茂歡迎您!”的unicode嗎,網上可以查到,這樣就sms pdu就構建完成了。還需要特別提醒一下的是,在pdu構建完成,向設備寫pdu串的時候不要忘記最後要添加ctrl+z,因為這是設備識別pdu串結束的標誌。ctrl+z的assic碼是0x1a。其中還要重點提一下就是 AT+CMGS=?的計算方法 15+短信字符數*2。具體的實現代碼如下。
charsmstype[]="AT+CMGF=0\r";
charsmscmgs[]="AT+CMGS=31\r";
charpdu[]="0891683108501105F011000D91688197062811F2000800316C5F592779D183026B228FCE60A8FF01
\0x1a";
write(fd_usb,smstype,sizeof(smstype));
usleep(20000);
write(fd_usb,smscmgs,sizeof (smscmgs));
usleep(20000);
write(fd_usb,pdu_warn,sizeof(pdu_warn));
usleep(20000);
四. 開發其他功能,詳細參見AT指令集
[3G/4G]3G/4G模塊開發