为什么会出现这种奇怪的无限循环?
Why this weird infinite loop occuring?
我正在写一个 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" 的有效句子时,代码会陷入无限循环,如果条件成立但永远不会 运行 直到第二个if条件成立,再往回绕,不应该这样。
这个无限循环不检查条件 encry_flag 是真还是假,并且永远不会转到正在清除缓冲区的语句。
从屏幕截图中,您可以了解到 for 循环和 for 循环内的 while 循环中断,因为一次又一次地打印总字符串,这在 for 循环之前只完成一次。
这个无限循环是从哪里创建的?我完全迷路了。
仅供参考:如果 "azyb" 和 "byza" 没有在开头和结尾添加,代码 运行 就好了,因为它永远不会满足任何 if 条件。我也尝试使用一个字符("azybhbyza" 来打印 "h"),但结果是一样的。
我不熟悉arduino但是
if (line[i+1] == 'b' && line[i+2] == 'y' && line[i+3] == 'z' && line[i+4] == 'a')
它不应该以 i 开头吗?我看到你使用了字符指针 "sentance" 但据我所知你还没有在任何地方初始化它。未初始化的指针可能会导致内存损坏,具体取决于编译器内存管理。根据硬件内存,我也在考虑它也可能破坏其他一些内存内容的事实。这可以解释您的变量 "i" 没有到达终点。尝试用一些 space 像
初始化句子
sentance = new char[25];
可能有用。而且,如果您在硬件上进行测试,它有时可能会表现异常。
我正在写一个 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" 的有效句子时,代码会陷入无限循环,如果条件成立但永远不会 运行 直到第二个if条件成立,再往回绕,不应该这样。
这个无限循环不检查条件 encry_flag 是真还是假,并且永远不会转到正在清除缓冲区的语句。
从屏幕截图中,您可以了解到 for 循环和 for 循环内的 while 循环中断,因为一次又一次地打印总字符串,这在 for 循环之前只完成一次。
这个无限循环是从哪里创建的?我完全迷路了。
仅供参考:如果 "azyb" 和 "byza" 没有在开头和结尾添加,代码 运行 就好了,因为它永远不会满足任何 if 条件。我也尝试使用一个字符("azybhbyza" 来打印 "h"),但结果是一样的。
我不熟悉arduino但是
if (line[i+1] == 'b' && line[i+2] == 'y' && line[i+3] == 'z' && line[i+4] == 'a')
它不应该以 i 开头吗?我看到你使用了字符指针 "sentance" 但据我所知你还没有在任何地方初始化它。未初始化的指针可能会导致内存损坏,具体取决于编译器内存管理。根据硬件内存,我也在考虑它也可能破坏其他一些内存内容的事实。这可以解释您的变量 "i" 没有到达终点。尝试用一些 space 像
初始化句子sentance = new char[25];
可能有用。而且,如果您在硬件上进行测试,它有时可能会表现异常。