Go Down

Topic: Serial.read() -> Ausgabe mehrfach (Read 875 times) previous topic - next topic

aargau

Ich habe ein kleines Problem und komm nicht weiter.
Ich habe eine kleine Visual Basic Anwendung welche verschiedene Strings an den Arduino sendet. Momentan in der Testphase ohne irgend welche CRC Prüfung, kommt dann ev. noch hinzu.
Das Problem ist nun wenn ich z.B. "test" an den uC sende und danach "day" nimmt der uC nochmals "test" an obwohl dies gar nicht gesendet wurde und erst nach mehrfachem senden des "day" wird dann auch wirklich dies angenommen.
Ich dachte mir zuerst dass das char array ev. irgend wie falsch ist und habe es danach einfach direkt mal jedesmal mit "0" gefüllt was aber auch keine Besserung bringt.
Sieht jemand den Fehler?
Code: [Select]
long mili ;

char input[15];  // puffer für die Daten
char current;     // puffer für empfangenes Zeichen
int incount = 0;  // Zähler zum schreiben in den Puffer
bool lineComplete = false; //
void loop() {
mili = millis();
temp_update();
  int z=1;
  while ( (Serial.available()) & (incount < 16) & (!lineComplete) )
  {
    current = Serial.read(); // aktuelles Zeichen einlesen
    if (current != 10)            // ist das empfange Zeichen kein ENTER
    {
      if(current==13)
      {
      } else {
       input[incount] = current;
       incount++;
      }
    }
    else
    {
        input[incount] = '\0';
        lineComplete = true;
    }
  }

    if (lineComplete) {
      z= 1;
    lineComplete = false;
    incount = 0;
    current=0;
    String rec = String(input);
    // Soll das Array leeren....
    for (int j=0; j<15; ++j) {input[j] = '\0'; }
   
   
    // Ein paar Tests, nicht weiter beachten...
    if(rec=="test")
    {
      toggle() ;
    } else {
     
      if(rec=="night")
      {
       analogWrite(LCDLIGHT, 7);
      } else {
       
       if(rec=="day")
      {
       analogWrite(LCDLIGHT, 250);
      }
       
      }
     
     
    }
}

 
}

mmi

Auf den ersten (flüchtigen) Blick muss

Code: [Select]
while ( (Serial.available()) & (incount < 16) & (!lineComplete)

in

Code: [Select]
while ( (Serial.available()) && (incount < 16) && (!lineComplete)

geändert werden, also 2x& - Du willst ja eine bedingungsabhängige Verknüpfung.

Gruß, mmi.

aargau

Danke! Es scheint wirklich daran gelegen zu haben. Nun Funktioniert es zumindest bei mehrfachem Test ohne das beschriebene Problem.

df6ih

Vor der Änderung hat er deine Ausgabe vermutlich 3-fach ausgegeben. Da gibt es überall so eine DIN A4 Seiten große Erklärung zu den Operatoren in C, wenn man das mal gelesen hat passiert das nicht mehr.

Go Up