我正在写一个arduino串行通信代码,我将通过串行通信发送句子,如“azyb”句子“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为true或false,则永远不会进入清除缓冲区的语句 . 从屏幕截图中你可以理解for循环中的for循环和while循环中断,因为一次又一次地打印总字符串,这在循环之前只进行一次 .
从哪里创建这个无限循环?我完全迷失了 .
仅供参考:如果未在开头和结尾添加“azyb”和“byza”,则代码运行正常,因为它从不满足任何条件 . 我也尝试使用一个字符(“azybhbyza”来打印“h”),但结果是一样的 .
1 回答
我不熟悉arduino但是
它不应该从我开始吗?而且我看到你使用了一个字符指针“sentance”但是你还没有在任何地方初始化它,据我所知 . 未初始化的指针可能会导致内存损坏,具体取决于编译器内存管理 . 根据硬件内存,我也在考虑它也可能损坏其他内存 . 这可以解释你的变量“我”没有达到目的 . 尝试使用某些空间初始化sentance
它可能会奏效 . 而且如果你在硬件上进行测试,它有时会表现得很怪异 .