Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 捕获字符串/字符数组中的串行输入_C++_C_Arduino_Gsm - Fatal编程技术网

C++ 捕获字符串/字符数组中的串行输入

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:

我在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: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。