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从调制解调器获取的响应文本。

每个命令之后的最终结果代码(例如, OKERRORCME 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

非常感谢您张贴这个!