GSM SM5100B CMEERROR:4错误

moh*_*mad 3 sms gsm arduino send at-command

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

hlo*_*dal 14

关于您处理AT命令的一般说明.

不不不!这种做法永远不会可靠.在发送"要发送的文本"之前,您必须 等待>收到该字符.或者实际上它不仅仅是>角色,而是四个角色.3GPP规范27.005:

  • <CR><LF><greater_than><space> 在命令行终止后,TA应发送一个四字符序列 (IRA 13,10,62,32)<CR>; 之后,可以从TE输入文本到ME/TA.

(TA(终端适配器)这里指调制解调器和TE(终端设备)AT命令的发送者)

对于任何可中止的AT命令(以及27.005明确指出AT + CMGS This command should be abortable.),任何字符的发送都将中止命令的操作.引用ITU V.250:

5.6.1中止命令

...

通过从DTE到任何角色的DCE的传输来完成命令的中止.

(DCE(数据通信设备)这里指调制解调器和DTE(数据终端设备)AT命令的发送者)

这意味着当您在调制解调器发送"\ r \n>"之前发送"要发送的文本"时,命令将被中止.没有办法等待"足够长"以期望发送响应.您必须阅读并解析从调制解调器返回的响应文本.

这同样适用于在每个命令之后的最终结果代码(例如OK, ERROR,CME ERROR和几个).例如,发送"AT + CMGF = 1"然后在没有先等待OK的情况下发送下一个命令就是要求解决问题.所以总是在发送AT命令时,你必须在发送下一个命令之前等待最终的结果代码.

请永远不要delay等待任何AT命令响应.它就像踢狗一样有用,可以阻挡它们移动.是的它可能实际上有效,但在某些时候你会抱歉采取这种方法......

回答你的问题.

根据你得到的反应,我可以看到你的问题不是命令堕胎(虽然你的解析有严重的问题,如上所述,你应该修复),CME ERROR是你最好的线索.从27.007的"9.2.1一般错误"一节中,它给出operation not supported了值4的描述.

27.005指出:

如果在网络中发送失败或ME错误,则返回最终结果代码+ CMS ERROR :.

请注意,这是+ CMS ERROR而不是+ CME ERROR,但它适用,请参阅下文.

我想这一系列动作如下:

SM100B GSM调制解调器的AT命令处理部分接受短信数据并以适当的格式对其进行格式化,并将其发送到与GSM网络通信的调制解调器部分.它成功地将短信数据发送到网络并将其报告回AT命令处理部分,然后打印+CMGS: 25和最终结果代码OK.但是,在短时间后,网络会发回短信的拒绝消息,然后将其作为+ CME ERROR响应给出.

如果我的猜测是正确的,那么响应是否应该以+ CMS ERROR的形式发送?不,因为已经给出了AT + CMGS命令的最终响应(OK),并且永远不应该为命令返回多个最终结果代码(错误除外(注释1)).虽然+ CME ERROR可以替换ERROR最终结果代码,但它不仅是最终结果代码.从AT + CMEE命令描述:

设置命令禁用或启用结果代码+ CME ERROR的使用:作为与MT功能相关的错误的指示.启用时,MT相关错误会导致+ CME ERROR:最终结果代码而不是常规ERROR最终结果代码.当错误与语法,无效参数或TA功能相关时,ERROR会正常返回.

因此,+ CME ERROR既可以是最终结果代码,也可以是未经请求的结果代码(也可能是中间结果代码).

但AT + CMGS命令是否等待接收网络拒绝并返回+ CMS ERROR?可能不是.在不太了解短信发送的网络细节的情况下,今天的拒绝可能会在比以前更晚的时间发生.这种变化有时是GSM相关AT命令的问题,其具有最初与GSM行为紧密相关的旧遗产,随着技术转向GPRS,UMTS,LTE等,有时变得越来越不真实.

注1:

我之前的一位同事曾经抱怨标准指定语音呼叫处理的方式,因为在ATD1234之后; 命令你首先得到最终结果代码OK,然后在调用结束后你得到一个新的最终结果代码NO CARRIER.这个非常糟糕的设计,呼叫结束指示应该是一个特定的未经请求的响应,而不是最终的响应.

总结一下

您的短信似乎被网络拒绝了.试着找出原因.您还应该解决AT命令处理方面的一些严重问题; 没有读取和解析调制解调器的响应文本就无法处理AT命令.