GSM SM5100B CMEERROR:4错误
我正在使用Arduino来控制一个SM5100B GSM设备,除了当我想在收到另一个短信时发送短信。 我得到这个,
错误代码:
OK> + CMGS:2 5 OK + CMEERROR:4
我处理上述收到的短信的代码:
#include <SoftwareSerial.h> //Include the NewSoftSerial library to send serial commands to the cellular module. char inchar; //Will hold the incoming character from the Serial Port. SoftwareSerial cell(2,3); char mobilenumber[] = "0597010129"; void setup() { //GSM Serial.begin(9600); // opens serial port, sets data rate to 9600 bps Serial.println("Initialize GSM module serial port for communication."); cell.begin(9600); delay(35000); // give time for GSM module to register on network etc. Serial.println("delay off"); cell.println("AT+CMGF=1"); // set SMS mode to text delay(200); cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to serial out upon receipt delay(200); } void loop() { if(cell.available() >0)//If a character comes in, from the cellular module { inchar=cell.read(); Serial.println(inchar); if (inchar=='#'){ // OK - the start of our command delay(10); inchar=cell.read(); Serial.println(inchar); if (inchar=='a'){ delay(10); Serial.println("The folowing SMS : \n"); inchar=cell.read(); Serial.println(inchar); if (inchar=='0'){ //sequance = #a0 Serial.println("#a0 was received"); } else if (inchar=='1'){//sequance = #a1 Serial.println("#a1 was received "); sendSms(); } } cell.println("AT+CMGD=1,4");// AT command to delete all msgs Serial.println(" delete all SMS"); } }//end of if(cell.available() >0) {...} } void sendSms(){ //cell.println("AT+CMGF=1"); // set SMS mode to text cell.print("AT+CMGS="); // now send message... cell.print((char)34); // ASCII equivalent of " cell.print(mobilenumber); cell.println((char)34); // ASCII equivalent of " delay(500); // give the module some thinking time cell.print(":D hello m3alleg :D"); // our message to send cell.println((char)26); // ASCII equivalent of Ctrl-Z delay(20000); }
有关处理AT命令的一般注意事项。
不不不! 这种做法永远不会可靠。 在发送“发送文本”之前,您必须等待>
字符被接收。 或者实际上它不是>
字符,它是四个字符。 引自3GPP规范27.005 :
- 命令行以
<CR>
结束后,TA应发送一个四字符的序列<CR><LF><greater_than><space>
(IRA<CR><LF><greater_than><space>
)。 之后可以从TEinput文本到ME / TA。
(TA(terminal适配器)在这里是指调制解调器和TE(terminal设备)是AT命令的发送者)
对于任何放弃的AT命令(和27.005明确说明AT + CMGS This command should be abortable.
)发送任何字符将中止命令的操作。 引用ITU V.250 :
5.6.1中止命令
…
通过从DTE到任何字符的DCE的传输完成命令的中止。
(DCE(数据通信设备)在这里是指调制解调器和DTE(数据terminal设备)是AT命令的发送者)
这意味着,在调制解调器发送“\ r \ n>”之前发送“发送文本”命令将被中止。 没有办法等待“足够长的时间”以期望回复发送。 您必须阅读并parsing从调制解调器获取的响应文本。
每个命令之后的最终结果代码(例如, OK
, ERROR
, CME ERROR
等等)也是如此。 例如,发送“AT + CMGF = 1”,然后发送下一个命令而没有先等待确定就是问题。 所以总是在发送AT命令时, 必须在发送下一个命令之前等待最后的结果代码。
切勿使用delay
等待任何AT命令响应。 它和踢狗一样有用,可以让你移动。 是的,它可能实际上工作了一段时间,但在某些时候,你会为采取这种方法感到抱歉…
回答你的问题。
基于你得到的答复,我可以看到你的问题不是命令堕胎(虽然你的parsing有严重的问题,如上所述,你应该修复),和CME错误是你最好的线索。 从27.007中的“9.2.1一般错误”一节中可以看出, operation not supported
作为值4的描述。
27.005指出:
如果networking发送失败或ME错误,则返回最终结果代码+ CMS ERROR:。
请注意,这是+ CMS错误,而不是+ CME错误,但它适用,见下文。
我想这一系列的行动如下:
SM100B GSM调制解调器的AT命令处理部分接受SMS数据,并以适当的格式将其格式化,并将其发送到与GSMnetworking通信的调制解调器部分。 它成功地将短信数据发送到networking,并将其报告回AT命令处理部分,然后打印+CMGS: 25
和最终结果码OK
。 然而,在短时间之后,networking发回一个短信的拒绝信息,然后给出+ CME ERROR响应。
如果我上面的猜测是正确的,那么应该将响应作为+ CMS错误代替? 不,因为AT + CMGS命令的最终响应已经给出(OK),并且不应该返回一个命令的多个最终结果代码(除了错误(注1))。 而+ CME ERROR可以replaceERROR最终结果代码,它不仅是最终的结果代码。 从AT + CMEE命令描述:
设置命令禁用或启用使用结果代码+ CME ERROR:作为与MTfunction有关的错误的指示。 启用时,与MT有关的错误会导致+ CME ERROR:最终结果代码,而不是常规的ERROR最终结果代码。 当错误与语法,无效参数或TAfunction有关时,ERROR正常返回。
因此+ CME ERROR既可以是最终结果代码,也可以是未经请求的结果代码(也可能是中间结果代码)。
但AT + CMGS命令不能等待接收networking拒绝,并返回+ CMS错误? 可能不会。 不知道有关短信发送的networking细节太多,今天的拒绝可能会比以前晚得多。 GSM相关的AT命令有时会带来这样的变化,这些命令具有原来与GSM行为紧密联系的传统,随着技术向GPRS,UMTS,LTE等转移,有些时候会变得越来越不真实。
注1:
我以前的一位同事曾经抱怨过这个标准规定了语音呼叫处理的方式,因为ATD1234之后; 命令你首先得到最终的结果代码OK,然后当通话结束时,你会得到一个新的最终结果代码NO CARRIER。 这个糟糕的devise,呼叫结束指示应该是一个特定的主动回应,而不是最终的回应。
所以总结一下
你的短信似乎被networking拒绝了。 试着找出原因。 你的AT命令处理也有一些严重的问题,你应该修复; 没有读取和parsing来自调制解调器的响应文本,就无法处理AT命令。
cell.println( “AT + CNMI = 3,3,0,0”); //设置模块发送短信数据到串行输出收到
对于任何正在寻找答案的人,我都有同样的问题:
我试图通过发送短信唤醒GSM模块从睡眠模式 ,它不能马上工作。 电话直接进入UART,但对于短信,您必须使用此命令设置模块发送短信数据到串行端口收到。
AT + CNMI = 3,3,0,0
非常感谢您张贴这个!