Hilfe beim bekämpfen von bösem "delay"...

Hallo,
mein Programm liest serielle Strings ein und soll bei bestimten Strings (Befehlen) reagieren.
Es können kurze Befehle (hier max. 40 Zeichen) kommen, z.B. "test" der dann entsprechend erkannt werden soll oder auch
andere (eventuell sehr lange) Strings die zu verwerfen sind, aber natürlich das Programm nicht irgendwie überfordern sollen.
Das Ende eines String ist jeweils erreicht wenn eine kurze Pause im seriellen Datenstrom eintritt, das "böse" delay in meinem Sketch:

...
void loop()                                          // Hauptprogramm
              {
              char serstring[41];                    // Puffer für String
              char c;                                // 1 Zeichen des String
              int i=0;                               // Zähler für Stringlänge
              memset(serstring,0,sizeof(serstring)); // Puller löschen
              if (Serial.available())
              {
                delay(100);                          // Kurz warten auf weitere Zeichen 
                while (Serial.available() && (i<40))
                {
                  c=Serial.read();
                  if (c>31)                           // Nur ASCII >31 einlesen (kine Steuerzeichen)
                   {
                     serstring[i] = c;
                     i++;
                   }  
                 }
               }
               if (strcmp(serstring,"test")==0)
               {
                 Serial.println("test eingelesen");
                 // Mach noch dies und das
               }
               else if (strcmp(serstring,"")!=0)
               {
                 Serial.print("anderer String eingelesen: ");
                 Serial.println(serstring);
               } 
              }
...

Prinzipiell läuft das so. Die kurzen Strings (Befehle) werden erkant, bei längeren Datenströmen habe ich aber den Eindruck daß sich das irgendwie verschluckt, vermutlich wegen dem Delay und dem vermutlich folgenden Überlauf des UART Puffer...

Hat hier jemand eine Idee wie ich das Delay wegbekomme und sauber programmieren kann?

Danke im Voruas,
Christian

Hallo Christian,
die Endekennung "kurze Pause" ( ich rate mal ca. 100 ms wegen deines delays) ist relativ schwierig in den Griff zu kriegen.
Ein Endezeichen ( z.B. Zeilenende ) wäre deutlich einfacher.

Ansonsten ist bewährt, in jedem loop - Durchlauf nur 1 Zeichen zu lesen.

Du könntest dir, wenn eins da ist, die millis() merken und das Zeichen natürlich, und wenn kein neues Zeichen da ist, testen ob genug Zeit vergangen ist, um den Text auszuwerten.

Ein Programmbeispiel brauchst du sicher nicht, wichtig ist:

[b]static [/b] char serstring[41]; 
static byte i=0; // Zähler für Stringlänge

Viel Spass.

Nachtrag: na gut, zwei Zeilen ...

Ist nicht Serial.flush(); dafür zuständig?

skorpi08:
Ist nicht Serial.flush(); dafür zuständig?

wofür ?
Serial.flush:

Waits for the transmission of outgoing serial data to complete. (Prior to Arduino 1.0, this instead removed any buffered incoming serial data.)

Braucht man also eigentlich nicht, denn ansonsten wartet Serial.write() auch, wenn der Puffer voll ist. ...

Der Vorschlag von michael_x mit millis() die Zeit zu messen ist mit Sicherheit eine Lösung des Problems..

Meine Idee wäre noch gewesen ein Ende Zeichen einzuführen, z.b. '#'
Wenn das kommt dann ist der String komplett.

Geht natürlich nur wenn du die "Sender Software" entsprechend anpassen kannst.

Ich habe gerade heute das Problem bei meinem Quadcopter-Projekt gelöst. Wie Michael-x schon sagte, ist es besser bei jeder Loop nur 1 Zeichen zu lesen. Wenn man z.B. den ganzen String auf einmal liest ist der Arduino nur damit beschäftigt, und bekommt u.U. nicht mit was sonst noch passiert. Ich habe dies durch eine "Statusänderung" in einer Switch/Case Anweisung gelöst. Hier kann ich den Input verifizieren und ggf den Buffer gezielt löschen. Da ich dies nicht gut beschreiben (selber newbie) würde ich bei Interesse den Code mal einstellen.
Gruß
Kucky