2016-04-20 47 views
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是真或假,并且永远不会去到缓冲区被清除的语句。 从截图中,您可以理解for循环中的for循环和while循环会因为总的字符串被一次又一次地打印而在循环之前仅执行一次。 enter image description here

从哪里创建这个无限循环?我完全迷失了。如果在开始和结束时没有添加“azyb”和“byza”,代码运行得很好,因为它从来没有满足任何条件。我也尝试使用一个字符(“azybhbyza”打印“h”),但结果是一样的。

回答

-1

我不熟悉的Arduino但

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

如果它不是我下手?而且我看到你使用了一个字符指针“sentance”,但是你还没有初始化它,就我所知。未初始化的指针可能会导致内存损坏,具体取决于编译器内存管理。根据硬件内存的不同,我也在考虑它可能会损坏其他一些内存内容的事实。这可能会解释你的变量“我”没有达到最后。尝试使用一些空间初始化传票

sentance = new char[25]; 

它可能工作。而且,如果您正在硬件上进行测试,它有时可能会表现怪异。

+0

我的变量i在声明句子指针之前被初始化,所以句子的存储器不能破坏我的值,据我所知。 – Anklon

+0

好吧,我不知道哥们 – Soulslayer