C++ 捕获字符串/字符数组中的串行输入
我在Arduino Uno和TC35 GSM模块之间有一个软件串行链路,用于发送和接收SMS消息。发送SMS'/呼叫不是问题,因为这是向GSM模块发送适当AT命令的问题。但是,我希望使用AT+CMGR=1命令(检查SIM卡上存储的第一条短信)来检查是否有任何信息,并将信息存储为字符数组,这样我就可以检查短信是否包含“开”或“关”来激活LED AT+CMGR=1命令应返回以下内容:C++ 捕获字符串/字符数组中的串行输入,c++,c,arduino,gsm,C++,C,Arduino,Gsm,我在Arduino Uno和TC35 GSM模块之间有一个软件串行链路,用于发送和接收SMS消息。发送SMS'/呼叫不是问题,因为这是向GSM模块发送适当AT命令的问题。但是,我希望使用AT+CMGR=1命令(检查SIM卡上存储的第一条短信)来检查是否有任何信息,并将信息存储为字符数组,这样我就可以检查短信是否包含“开”或“关”来激活LED AT+CMGR=1命令应返回以下内容: AT+CMGR=1 +CMGR: "REC READ","+3538xxxxxxxx",,"13/03/23,14:
AT+CMGR=1
+CMGR: "REC READ","+3538xxxxxxxx",,"13/03/23,14:29:37+00"
Set
OK
但在下面的方法中,当我打印“数据”时,它只返回:
信息内容包括:
在
任何指点都将不胜感激
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);
}
void checkMessage(){
gsmSerial.println(“AT+CMGR=1”);//读取第一条短信
对于(x=0;x<255;x++){
数据[x]='\0';
}
x=0;
做{
while(gsmSerial.available()==0);
data[x]=gsmSerial.read();
x++;
如果(数据[x-1]==0x0D&&data[x-2]==='“'”){
x=0;
}
}而(!(数据[x-1]='K'&数据[x-2]='O');
数据[x-3]='\0';//在确定之前完成字符串
Serial.println(“\r\n消息包含:\r”);
Serial.println(data);//显示消息
延迟(1000);
}
我不理解您这样做的意图:
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
当你点击包含尾随引号和换行符的行时,似乎你正在丢弃数据并读取新数据。因此,对感兴趣的命令的响应正在被丢弃。我还没有测试它,但我认为如果你删除这三行,它会起作用
我还应该提到
[x-1]
和[x-2]
正在引用数据
缓冲区之前的内存。这是一种非常糟糕的做法,可能会导致未定义的行为。只有当计算结果为正值时,才应检查索引减去某些值。负数组索引将在数组开始之前访问内存。我不知道坚持你这样做的意图:
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
当你点击包含尾随引号和换行符的行时,似乎你正在丢弃数据并读取新数据。因此,对感兴趣的命令的响应正在被丢弃。我还没有测试它,但我认为如果你删除这三行,它会起作用
我还应该提到
[x-1]
和[x-2]
在数据
缓冲区之前引用内存。这是一种非常糟糕的做法,会导致未定义的行为。只有当计算结果为正值时,才应检查索引减去某些值。负数组索引将在数组开始之前访问内存。什么是data
?什么是gsmSerial
?数据是字符数组;字符数据[256]。gsmSerial是Arduino和GSM模块之间的软件串行连接。为了简化代码,我建议您只需打开单词(所有大写字母),这样您就不必搜索整个消息。这还可以防止意外的“This This ON?”?“打开LED。什么是数据
?什么是gsmSerial
?数据是字符数组;字符数据[256]。gsmSerial是Arduino和GSM模块之间的软件串行连接。为了简化代码,我建议您只需打开单词(所有大写),这样您就不必搜索整个消息。这也可以防止意外的“This This This on?”打开LED。