2 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超3個(gè)贊
關(guān)于您處理AT命令的一般說明。
不不不!這種做法永遠(yuǎn)不會(huì)可靠。在發(fā)送“要發(fā)送的文本”之前,您必須 等待>
收到該字符?;蛘邔?shí)際上它不僅僅是>
角色,而是四個(gè)角色。引自3GPP規(guī)范27.005:
<CR><LF><greater_than><space>
在命令行終止后,TA應(yīng)發(fā)送一個(gè)四字符序列 (IRA 13,10,62,32)<CR>
; 之后,可以從TE輸入文本到ME / TA。
(TA(終端適配器)這里指調(diào)制解調(diào)器和TE(終端設(shè)備)AT命令的發(fā)送者)
對(duì)于任何可中止的AT命令(以及27.005明確指出AT + CMGS This command should be abortable.
),任何字符的發(fā)送都將中止命令的操作。引用ITU V.250:
5.6.1中止命令
...
通過從DTE到任何角色的DCE的傳輸來完成命令的中止。
(DCE(數(shù)據(jù)通信設(shè)備)這里指調(diào)制解調(diào)器和DTE(數(shù)據(jù)終端設(shè)備)AT命令的發(fā)送者)
這意味著當(dāng)您在調(diào)制解調(diào)器發(fā)送“\ r \ n>”之前發(fā)送“要發(fā)送的文本”時(shí),命令將被中止。沒有辦法等待“足夠長(zhǎng)”以期望發(fā)送響應(yīng)。您必須閱讀并解析從調(diào)制解調(diào)器返回的響應(yīng)文本。
這同樣適用于在每個(gè)命令之后的最終結(jié)果代碼(例如OK
, ERROR
,CME ERROR
和幾個(gè))。例如,發(fā)送“AT + CMGF = 1”然后在沒有先等待OK的情況下發(fā)送下一個(gè)命令就是要求解決問題。所以總是在發(fā)送AT命令時(shí),你必須在發(fā)送下一個(gè)命令之前等待最終的結(jié)果代碼。
請(qǐng)永遠(yuǎn)不要delay
等待任何AT命令響應(yīng)。它就像踢狗一樣有用,可以阻擋它們移動(dòng)。是的它可能實(shí)際上有效,但在某些時(shí)候你會(huì)抱歉采取這種方法......
回答你的問題。
根據(jù)你得到的反應(yīng),我可以看到你的問題不是命令墮胎(雖然你的解析有嚴(yán)重的問題,如上所述,你應(yīng)該修復(fù)),CME ERROR是你最好的線索。從27.007的“9.2.1一般錯(cuò)誤”一節(jié)中,它給出operation not supported
了值4的描述。
27.005指出:
如果在網(wǎng)絡(luò)中發(fā)送失敗或ME錯(cuò)誤,則返回最終結(jié)果代碼+ CMS ERROR :.
請(qǐng)注意,這是+ CMS ERROR而不是+ CME ERROR,但它適用,請(qǐng)參閱下文。
我想這一系列動(dòng)作如下:
SM100B GSM調(diào)制解調(diào)器的AT命令處理部分接受短信數(shù)據(jù)并以適當(dāng)?shù)母袷綄?duì)其進(jìn)行格式化,并將其發(fā)送到與GSM網(wǎng)絡(luò)通信的調(diào)制解調(diào)器部分。它成功地將短信數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)并將其報(bào)告回AT命令處理部分,然后打印+CMGS: 25
和最終結(jié)果代碼OK
。但是,在短時(shí)間后,網(wǎng)絡(luò)會(huì)發(fā)回短信的拒絕消息,然后將其作為+ CME ERROR響應(yīng)給出。
如果我的猜測(cè)是正確的,那么響應(yīng)是否應(yīng)該以+ CMS ERROR的形式發(fā)送?不,因?yàn)橐呀?jīng)給出了AT + CMGS命令的最終響應(yīng)(OK),并且永遠(yuǎn)不應(yīng)該為命令返回多個(gè)最終結(jié)果代碼(錯(cuò)誤除外(注釋1))。雖然+ CME ERROR可以替換ERROR最終結(jié)果代碼,但它不僅是最終結(jié)果代碼。從AT + CMEE命令描述:
設(shè)置命令禁用或啟用結(jié)果代碼+ CME ERROR的使用:作為與MT功能相關(guān)的錯(cuò)誤的指示。啟用時(shí),MT相關(guān)錯(cuò)誤會(huì)導(dǎo)致+ CME ERROR:最終結(jié)果代碼而不是常規(guī)ERROR最終結(jié)果代碼。當(dāng)錯(cuò)誤與語(yǔ)法,無效參數(shù)或TA功能相關(guān)時(shí),ERROR會(huì)正常返回。
因此,+ CME ERROR既可以是最終結(jié)果代碼,也可以是未經(jīng)請(qǐng)求的結(jié)果代碼(也可能是中間結(jié)果代碼)。
但AT + CMGS命令是否等待接收網(wǎng)絡(luò)拒絕并返回+ CMS ERROR?可能不是。在不太了解短信發(fā)送的網(wǎng)絡(luò)細(xì)節(jié)的情況下,今天的拒絕可能會(huì)在比以前更晚的時(shí)間發(fā)生。這種變化有時(shí)是GSM相關(guān)AT命令的問題,其具有最初與GSM行為緊密相關(guān)的舊遺產(chǎn),隨著技術(shù)轉(zhuǎn)向GPRS,UMTS,LTE等,有時(shí)變得越來越不真實(shí)。
注1:
我之前的一位同事曾經(jīng)抱怨標(biāo)準(zhǔn)指定語(yǔ)音呼叫處理的方式,因?yàn)樵贏TD1234之后; 命令你首先得到最終結(jié)果代碼OK,然后在調(diào)用結(jié)束后你得到一個(gè)新的最終結(jié)果代碼NO CARRIER。這個(gè)非常糟糕的設(shè)計(jì),呼叫結(jié)束指示應(yīng)該是一個(gè)特定的未經(jīng)請(qǐng)求的響應(yīng),而不是最終的響應(yīng)。
總結(jié)一下
您的短信似乎被網(wǎng)絡(luò)拒絕了。試著找出原因。您還應(yīng)該解決AT命令處理方面的一些嚴(yán)重問題; 沒有讀取和解析調(diào)制解調(diào)器的響應(yīng)文本就無法處理AT命令。

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt
對(duì)于那些正在尋找同樣問題答案的人我:
我試圖通過發(fā)送短信來喚醒gsm模塊從睡眠模式,它不會(huì)馬上工作。電話直接轉(zhuǎn)到UART,但對(duì)于短信,你必須使用此命令設(shè)置模塊在收到時(shí)將SMS數(shù)據(jù)發(fā)送到串口。
AT + CNMI = 3,3,0,0
添加回答
舉報(bào)