捕获string / char数组中的串行输入

时间:2013-03-25 20:16:27

标签: c++ c arduino gsm

我在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);
}

1 个答案:

答案 0 :(得分:3)

我不明白你这样做的意图:

if(data[x-1]==0x0D&&data[x-2]=='"'){ 
    x=0; 
}

当您点击包含尾随引号和换行符的行时,您似乎丢弃了数据并读取了新数据。因此,对于感兴趣的命令的响应被丢弃。我没有对它进行测试,但我认为如果你删除这三行就可以了。

我还应该提到[x-1][x-2]data缓冲区之前引用内存。这是一种非常糟糕的做法,可以并且将导致未定义的行为。只有当计算结果为正值时,才应检查索引减去某个值。负数组索引在数组启动之前访问内存。