0

我在 Arduino Uno 和 TC35 GSM 模块之间有一个软件串行链接,用于发送和接收 SMS 消息。发送 SMS'/calls 不是问题,因为它是向 GSM 模块发送适当的 AT 命令的问题。但是我希望使用 AT+CMGR=1 命令(检查存储在 SIM 卡上的第一条 SMS)来检查是否有任何消息并将消息存储为 char 数组,以便我可以检查 SMS 是否包含单词“开”或“关”来激活 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);
}
4

1 回答 1

3

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

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

每当您点击包含尾随引号和换行符的行时,您似乎都在丢弃数据并读取新数据。所以对感兴趣的命令的响应被丢弃了。我没有测试过它,但我认为如果你删除这三行它会起作用。

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

于 2013-03-25T20:26:16.967 回答