【发布时间】:2016-04-20 14:20:55
【问题描述】:
我正在编写一个 arduino 串行通信代码,我将通过串行通信发送句子,例如“azyb”+sentence+“byza”,其中第一和第二部分是识别我的句子将开始和结束。我的代码在这里(只是将循环功能作为其他功能正常工作):
void loop()
{
if (Serial.available() > 0)
{
int i=0, j=0, len=0;
char *sentance;
String line = Serial.readString();
len = line.length();
Serial.println(len);
Serial.println(line);
for (; i < len; i++)
if (line[i] == 'a' && line[i+1] == 'z' && line[i+2] == 'y' && line[i+3] == 'b'){
//first if
Serial.println("First");
i += 4;
while (i < len){
sentance[j] = line[i];
i++; j++;
if (line[i+1] == 'b' && line[i+2] == 'y' && line[i+3] == 'z' && line[i+4] == 'a'){
// second IF
Serial.println("Second");
sentance[j] = 'NULL';
encry_flag = true;
i = i + 4;
line = "";
break;
}
}
}
if (!encry_flag){
Serial.println("No code is send");
Write_text("damn "); // to write text in OLED display
}
else{
Serial.println(sentance);
Write_text(sentance); // to disply sentence in OLED display
encry_flag = false;
}
// clear the buffer
while (Serial.available() > 0)
char c= Serial.read();
}
}
但是当我发送一个像“azybanklonbyza”这样的有效句子时,它会在 OLED 显示器中显示“anklon”,代码会陷入无限循环,如果条件成立,则直到第一个条件成立,但如果条件成立,则永远不会运行到第二个,然后绕回来不应该这样。
这个无限循环不检查 encry_flag 是真还是假的条件,并且永远不会进入正在清除缓冲区的语句。 从屏幕截图中您可以了解到,for 循环中的 for 循环和 while 循环会中断,因为总字符串会一次又一次地打印,这在 for 循环之前只执行一次。
这个无限循环是从哪里创建的?我完全迷路了。
仅供参考:如果没有在开头和结尾添加“azyb”和“byza”,则代码运行得很好,因为它永远不会满足任何 if 条件。我也尝试使用一个字符(“azybhbyza”来打印“h”),但结果是一样的。
【问题讨论】:
标签: loops arduino serial-port infinite-loop