首页 文章

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

提问于
浏览
0

我正在写一个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”,则代码运行正常,因为它从不满足任何条件 . 我也尝试使用一个字符(“azybhbyza”来打印“h”),但结果是一样的 .

1 回答

  • -1

    我不熟悉arduino但是

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

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

    sentance = new char[25];
    

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

相关问题