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
不不不!这种做法永远不会可靠.在发送"要发送的文本"之前,您必须
等待>收到该字符.或者实际上它不仅仅是>角色,而是四个角色.引自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命令.