我在Arduino Uno和TC35 GSM模块之间有一个软件串行链接,用于发送和接收SMS消息。发送SMS'/呼叫不是问题,因为它是向GSM模块发送适当的AT命令的问题。但是,我希望使用AT + CMGR = 1命令(检查存储在SIM卡上的第一条SMS)来检查是否有任何消息,并将消息存储为字符数组,以便我可以检查SMS是否包含单词'on'或'off'激活LED。
AT + CMGR = 1命令应返回以下内容:
AT+CMGR=1
+CMGR: "REC READ","+3538xxxxxxxx",,"13/03/23,14:29:37+00"
Set
OK
但是在下面的方法中,当我打印'data'时它只返回:
消息包含:
AT
任何指针都会非常感激。
void checkMessage() {
gsmSerial.println("AT+CMGR=1"); //Reads the first SMS
for (x=0;x < 255;x++){
data[x]='\0';
}
x=0;
do{
while(gsmSerial.available()==0);
data[x]=gsmSerial.read();
x++;
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
}while(!(data[x-1]=='K'&&data[x-2]=='O'));
data[x-3]='\0'; //finish the string before the OK
Serial.println("\r\nMessage contains: \r");
Serial.println(data); //shows the message
delay(1000);
}
答案 0 :(得分:3)
我不明白你这样做的意图:
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
当您点击包含尾随引号和换行符的行时,您似乎丢弃了数据并读取了新数据。因此,对于感兴趣的命令的响应被丢弃。我没有对它进行测试,但我认为如果你删除这三行就可以了。
我还应该提到[x-1]
和[x-2]
在data
缓冲区之前引用内存。这是一种非常糟糕的做法,可以并且将导致未定义的行为。只有当计算结果为正值时,才应检查索引减去某个值。负数组索引将在数组启动之前访问内存。