为了账号安全,请及时绑定邮箱和手机立即绑定

GSM SM5100B CMEERROR:4错误

GSM SM5100B CMEERROR:4错误

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) {...}         }
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

关于您处理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, ERRORCME 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命令。


查看完整回答
反对 回复 2019-07-25
?
当年话下

TA贡献1890条经验 获得超9个赞

cell.println("AT+CNMI=3,3,0,0"); // set module to send SMS data to
serial out upon receipt

对于那些正在寻找同样问题答案的人我:

我试图通过发送短信唤醒gsm模块从睡眠模式,它不会马上工作。电话直接转到UART,但对于短信,你必须使用此命令设置模块在收到时将SMS数据发送到串口。

AT + CNMI = 3,3,0,0


查看完整回答
反对 回复 2019-07-25
  • 2 回答
  • 0 关注
  • 1546 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信