捕获字符串/字符数组中的串行输入
Capturing serial input in string/char array
我在Arduino Uno和TC35 GSM模块之间有一个软件串行链接来发送和接收SMS消息。发送短信/呼叫不是问题,因为它是发送适当的AT命令到GSM模块的问题。然而,我希望使用AT+CMGR=1命令(检查存储在SIM卡上的第一条短信)来检查是否有任何消息并将消息存储为字符数组,以便我可以检查短信是否包含单词"开"或"关"来激活LED。
AT+CMGR=1命令应该返回以下内容:
AT+CMGR=1
+CMGR: "REC READ","+3538xxxxxxxx",,"13/03/23,14:29:37+00"
Set
OK
但是在下面的方法中,当我打印'data'时,它只是返回:
消息包含:
在如能指点,不胜感激。
void checkMessage() {
gsmSerial.println("AT+CMGR=1"); //Reads the first SMS
for (x=0;x < 255;x++){
data[x]=' ';
}
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]=' '; //finish the string before the OK
Serial.println("rnMessage contains: r");
Serial.println(data); //shows the message
delay(1000);
}
我不明白你这样做的意图:
if(data[x-1]==0x0D&&data[x-2]=='"'){
x=0;
}
看起来你正在丢弃你的数据并读取新数据,每当你碰到一个包含引号和换行符的行。所以对兴趣命令的反应被丢弃了。我还没有测试过,但我认为如果你删除这三行就可以了。
我还应该提到[x-1]
和[x-2]
在data
缓冲区之前引用内存。这是一个非常糟糕的做法,可能会导致未定义的行为。只有当计算结果为正值时,才应该检查索引减去某个值。负的数组索引将在数组开始之前访问内存。
相关文章:
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- C++逗号分隔的输入数组代码过早退出
- 如何输入数组的元素,每次获得新元素时,我们将其放在数组的中间?
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 使用 cin 输入数组值
- 与 C++ 中一行中的用户输入数组元素相关的问题
- 将整数输入数组的方法比 scanf() 或 cin 更快?
- 如何在C 中动态输入数组
- 我想添加两个字符串类型的矩阵.用户将不会输入行数或列的数量.用户将仅输入数组
- 测试用户输入数组中的重复项的最有效方法是什么?
- 在用户输入数组中查找元音
- 如何将用户输入数组值移动到数组末尾并将其设置为 0
- 函数是否可以用较小的输入数组编写输入数组
- C++ 将数字输入数组并输出
- 需要帮助传递数组和输入数组
- 用户输入数组大小(N).从 0 到 N 的数字填充数组
- 输入int之后的字符的c++输入数组
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- 在C 函数中声明输入数组的大小
- 在 cpp 中使用 getline 输入数组中的空格分隔数字