2016-04-20 11 views
0

Ich schreibe einen arduino seriellen Kommunikationscode, wo ich Satz durch serielle Kommunikation wie "azyb" + Satz + "byza" senden werde, wo erster und zweiter Teil ist, um meinen Satz zu identifizieren, wird beginnen und enden. Mein Code ist hier (nur gibt die Loop-Funktion als andere funktionieren gut):Warum diese seltsame Endlosschleife auftritt?

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(); 

} 
} 

Aber wenn ich einen gültigen Satz wie „azybanklonbyza“ senden, die in eine gefangen in OLED-Display, der Code „anklon“ angezeigt Endlosschleife, die zuerst geht, wenn die Bedingung erfüllt ist, aber nie bis zur zweiten läuft, wenn die Bedingung erfüllt ist, und dann zurückkreist, was nicht so sein sollte.

Diese Endlosschleife prüft die Bedingung entweder nicht, ob "encr_flag" wahr oder falsch ist, und geht nie zu der Anweisung, bei der der Puffer gelöscht wird. Aus dem Screenshot können Sie verstehen, dass die for-Schleife und die while-Schleife innerhalb der for-Schleife bricht als insgesamt Strings immer wieder gedruckt wird, die nur einmal für for-Schleife erfolgt. enter image description here

Woher wird diese Endlosschleife erstellt? Ich bin total verloren.

FYI: wenn "azyb" und "byza" nicht am Anfang und am Ende hinzugefügt wird, lief der Code gut, da er nie eine if-Bedingung erfüllt. Ich habe versucht, mit einem Zeichen auch ("azybhbyza", um "h" zu drucken), aber das Ergebnis ist das gleiche.

Antwort

-1

Ich bin nicht vertraut mit Arduino aber

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

Sollte es nicht mit mir anfangen? Und ich sehe, dass Sie einen Zeichenzeiger "sentance" benutzt haben, aber Sie haben ihn nirgendwo und so weit ich weiß initialisiert. Der nicht initialisierte Zeiger kann je nach Speicherverwaltung des Compilers zu Speicherbeschädigungen führen. Je nach Hardware-Speicher denke ich auch daran, dass es auch andere Speicherinhalte verfälschen kann. Das kann erklären, dass Ihre Variable "i" nicht das Ende erreicht. Versuchen Sie, sentance mit etwas Raum zu initialisieren wie

Es kann funktionieren. Und auch, wenn Sie auf Hardware testen, kann es sich manchmal freaky verhalten.

+0

Meine Variable i wird initialisiert, bevor der Satzzeiger deklariert wird, so dass Satzspeicher den Wert von i nicht korrumpieren kann, soweit ich weiß. – Anklon

+0

gut, ich weiß nicht Kumpel – Soulslayer