【问题标题】:Why this weird infinite loop occuring?为什么会发生这种奇怪的无限循环?
【发布时间】: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


    【解决方案1】:

    我不熟悉arduino,但是

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

    不应该以 i 开头吗?而且我看到您使用了字符指针“句子”,但据我所知,您还没有在任何地方初始化它。取决于编译器内存管理,未初始化的指针可能会导致内存损坏。根据硬件内存,我也在考虑它也可能破坏其他一些内存内容的事实。这可以解释你的变量“i”没有到达终点。尝试使用一些空格来初始化句子,例如

    sentance = new char[25];
    

    它可能会起作用。而且,如果您在硬件上进行测试,它有时可能会表现得异常。

    【讨论】:

    • 我的变量 i 在语句指针被声明之前被初始化,所以据我所知,语句的内存不会破坏 i 的值。
    • 好吧我不认识哥们
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2011-12-08
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多