GSM SM5100B C M E E R R O R : 4 错误

Posted

技术标签:

【中文标题】GSM SM5100B C M E E R R O R : 4 错误【英文标题】:GSM SM5100B C M E E R R O R : 4 error 【发布时间】:2013-03-13 09:18:34 【问题描述】:

我正在使用 Arduino 来控制 SM5100B GSM 设备,一切正常,除非我想在收到另一条短信后发送短信。我明白了,

错误代码:

OK > + C M G S : 2 5 O K + C M E E R R O R : 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);

【问题讨论】:

【参考方案1】:

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

不,不,不!这种方法永远不会可靠地工作。你必须 等待接收到&gt; 字符,然后再发送“文本” 发送”。或者实际上它不仅仅是&gt; 字符,它是四个 人物。引用3GPP specification 27.005:

TA 应发送一个四字符序列 &lt;CR&gt;&lt;LF&gt;&lt;greater_than&gt;&lt;space&gt; (IRA 13, 10, 62, 32) 在命令行之后 以&lt;CR&gt; 终止;之后,文本可以从 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>”之前发送“要发送的文本”时 通过调制解调器,命令将被中止。没有办法等“久 足够”以期望发送响应。您必须阅读并解析 您从调制解调器返回的响应文本。

同样适用于每个命令后的最终结果代码(例如OKERRORCME 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命令说明:

Set 命令禁用或启用结果代码 +CME ERROR: 作为与错误相关的指示 MT的功能。启用后,MT 相关错误会导致 +CME ERROR: final result code 而不是 的常规 ERROR 最终结果代码。当错误与语法、无效参数、 或 TA 功能。

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

但是 AT+CMGS 命令不能等待接收网络 拒绝并返回 +CMS ERROR?可能不是。也不知 很多关于短信发送的网络细节,可能是这样的 今天的拒绝可能比以前晚得多。这样的 更改有时是与 GSM 相关的 AT 命令的问题,这些命令具有 最初与 GSM 行为紧密相关的古老遗产 随着技术转向 GPRS,有时会变得越来越不真实, UMTS、LTE 等。

注1:

我的一位前同事过去常常抱怨标准的方式 已指定语音呼叫处理,因为经过 ATD1234;命令 你首先得到最终结果代码OK,然后当调用时 结束后,您会得到一个新的最终结果代码 NO CARRIER。这简直太可怕了 糟糕的设计,呼叫结束指示应该是一个特定的不请自来的 回应而不是最终回应。

总结一下

您的短信似乎被网络拒绝了。尝试找出原因。 你的 AT 命令处理也有一些严重的问题 你应该修复;没有就无法处理 AT 命令 读取和解析来自调制解调器的响应文本。

【讨论】:

【参考方案2】:
cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to
serial out upon receipt

对于任何正在寻找与我遇到的相同问题的答案的人:

我试图通过发送短信将 gsm 模块从睡眠模式中唤醒,但它没有立即工作。电话直接发送到 UART,但对于短信,您必须使用此命令设置模块在收到短信数据时将短信数据发送到串口。

AT+CNMI=3,3,0,0

【讨论】:

以上是关于GSM SM5100B C M E E R R O R : 4 错误的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法在 0-1 背包 p‌r‌o‌b‌l‌e‌m 失败的情况

如何使用动态规划自顶向下方法解决这个 p‌r‌o‌b‌l‌e‌m?

在 localhost 启动 Tomcat 服务器时遇到了 p‌r‌o‌b‌l‌e‌m [重复]

R - 立即组合并求和

用?M?y?E?c?l?i?p?s?e? ?打?包?J?A?R文件

用h,o,s,e,t来组一个英语单词求求你们了