为什么会出现这种奇怪的无限循环?

时间:2016-04-20 14:20:56

标签: loops arduino serial-port infinite-loop

我正在编写一个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循环中断,因为一次又一次地打印总字符串,这在循环之前只执行一次。 enter image description here

从哪里创建无限循环?我完全迷失了。

仅供参考:如果未在开头和结尾添加“azyb”和“byza”,则代码运行正常,因为它从不满足任何if条件。我也尝试使用一个字符(“azybhbyza”来打印“h”),但结果是一样的。

1 个答案:

答案 0 :(得分:-1)

我不熟悉arduino但是

if (line[i+1] == 'b' && line[i+2] == 'y' && line[i+3] == 'z' && line[i+4] == 'a')

它不应该以i开头吗?而且我看到你使用了一个字符指针&#34; sentance&#34;但据我所知,你还没有在任何地方初始化它。未初始化的指针可能会导致内存损坏,具体取决于编译器内存管理。根据硬件内存,我也在考虑它也可能损坏其他一些内存内容。这可以解释你的变量&#34; i&#34;没有达到目的。尝试使用像

这样的空间初始化发送
sentance = new char[25];

它可能有用。而且,如果你在硬件上进行测试,它有时会表现得很怪异。