2016-04-20 51 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