ostiii:
Allerdings und nun kommen wir zum eigentlichen Topic ... habe ich nun wieder gute 5-6 sek delay, bis eine Poti Änderung von meinem Robo wahrgenommen wird.
Romane drucken kostet Zeit. Besonders Romane drucken bei 1200 Baud.
In den seriellen Eingangspuffer passen 63 Zeichen hinein. Bei Dir passiert das:
- 7 Bytes (mit Startbyte) empfangen
- einen Riesen-Roman draus machen und auf dem seriellen Monitor drucken
Während Du den Roman auf dem seriellen Monitor druckst, kommen neue Zeichen im seriellen Eingangspuffer an.
Und wenn Du den Roman jedes mal ein klein wenig langsamer auf dem seriellen Monitor druckst als die nächsten 6 Bytes ankommen, füllt sich der serielle Eingangspuffer immer mehr, bis er voll ist und Zeichen im Eingang verlorengehen.
Aber irgendwann ist der Roman auf dem seriellen Monitor zuende erzählt und dann schaut der Arduino nach, was er in seinem Eingangspuffer findet. Das ist ein FIFO-Puffer, also First-In-First-Out findet er die ältesten Daten. Bei 7 gesendeten Bytes und vollgelaufenem Puffer bei 7 Bytes Datenblocklänge sind 9 vollständige Datenblöcke im Eingangspuffer. Er zieht also als nächstes einen Datenblock aus dem Puffer (und druckt wieder einen Roman daraus), der schon 9 Sendeperioden alt ist.
Wenn der neuntletzte Datenblock ca. 4,5 Sekunden alt ist, dann bedeutet das: Du sendest ca. 2 Datenblöcke pro Sekunde.
Folgende Strategieen zur Abhilfe fallen mir ein:
-
Sende die Daten nie schneller, als der Arduino sie verarbeiten kann. Also insbesondere nicht schneller als das Drucken des Romans per Serial.print dauert.
-
Kürze den Roman, den Du per Serial.print ausdruckst! Wenn nur 7 Bytes ankommen, braucht man eigentlich nicht über 100 Bytes, um diese am Bildschirm darzustellen.
-
Mut zur Lücke! Hau am Ende, wenn der Roman per Serial.print fertig gedruckt ist, alle Zeichen, die sich im seriellen Eingangspuffer befinden,in die Tonne! Code dazu:
void loop() {
// put your main code here, to run repeatedly:
if (getBuf(buf,BUFSIZE))
{
Serial.print(" HEADER ");
Serial.print(buf[0]);
Serial.print(" BUF1 ");
Serial.print(buf[1]);
// FK = buf[1];
Serial.print(" BUF2 ");
Serial.print(buf[2]);
Serial.print(" BUF3 ");
Serial.print(buf[3]);
Serial.print(" BUF4 ");
Serial.print(buf[4]);
Serial.print(" BUF5 ");
Serial.print(buf[5]);
Serial.print(" BUF6 ");
Serial.println(buf[6]);
// Clear serial input buffer (may be overrun)
while (Serial.available()) Serial.read();
}
}
Der Arduino würde dann danach den NÄCHSTEN vollständigen nachfolgenden Datenblock auswerten. Was bei 2 Sendeblöcken pro Sekunde dann bis zu 0,5 Sekunden dauert, nachdem die Ausgabe auf Serial vollständig in den Serial-Ausgangspuffer (dessen Größe ebenfalls 63 Bytes) hineingeschoben wurde.
63 Zeichen im seriellen Ausgangspuffer zu senden dauert bei 1200 Baud auch ungefähr eine halbe Sekunde. So dass quasi nach Darstellung des letzten Buchstabens nahtlos mit der Ausgabe (praktisch) aktueller Daten fortgesetzt wird.
Tja, merkwürdige Effekte können entstehen, bei nur drei Puffern, in die mal was reingeschoben und mal was rausgezogen wird. In Deinem Fall hast Du es zu tun mit
- Serieller Sendepuffer des sendenden Systems
- Serieller Empfangspuffer des Arduino
- Serieller Sendepuffer des Arduino
Solange die Puffer praktisch leer sind, ist es äußerst überschaubar, was passiert.
Sobald auch nur einer dieser Puffer volläuft, können die merkwürdigsten Effekte entstehen.