HOWTO · Arduino

Arduino Serial Flush

Mit der Funktion Serial.flush() kann überprüft werden, ob die serielle Übertragung abgeschlossen ist oder nicht.

Auf dieser Seite

Auf Arduino wartet Serial.flush(), bis die ausgehenden seriellen Daten vollständig übertragen wurden. Die Funktion löscht keine eingehenden Daten und bestätigt auch nicht, dass ein anderes Gerät die Nachricht empfangen oder verarbeitet hat. Verwenden Sie sie, wenn der nächste Schritt erst beginnen soll, nachdem Arduino die aktuelle Übertragung abgeschlossen hat.

Was bewirkt Serial.flush() auf Arduino?

Serial.flush() hält das Sketch an, während die vorgemerkte Ausgabe über die serielle Schnittstelle gesendet wird. Sobald der Aufruf zurückkehrt, kann Arduino mit dem nächsten Vorgang fortfahren. Das ist nützlich, wenn die Ausgabe abgeschlossen sein muss, bevor eine weitere Aktion erfolgt – etwa bevor der Richtungspin eines Transceivers von Senden auf Empfangen umgeschaltet wird.

Der Aufruf betrifft den ausgehenden Übertragungspfad. Er leert weder den Empfangspuffer noch zeigt er an, ob ein angeschlossener Sensor oder Computer die Daten verstanden hat. Wenn Sie eine Bestätigung benötigen, legen Sie einen Nachrichtenaustausch fest und warten Sie auf eine Rückmeldung des anderen Geräts.

Serial.flush() in einem Arduino-Sketch verwenden

Diese Arduino-Aufrufsequenz sendet eine Zeile, wartet, bis die ausgehende Übertragung abgeschlossen ist, und fährt dann fort. Passen Sie Baudrate und Nachricht an das Gerät an, das mit Ihrem Board verbunden ist. Das vollständige C++-Programm unten verwendet einen kleinen lokalen Ersatz für Serial, damit sich die Sequenz auf einem Computer veranschaulichen lässt. Ersetzen Sie diesen Ersatz beim Anpassen des Sketches durch die Arduino-Core-Bibliothek Ihres Boards.

#include <iostream>

class SerialPort {
public:
  void begin(unsigned long baud) { (void)baud; }
  void println(const char* message) { std::cout << message << '\n'; }
  void flush() {}
};

SerialPort Serial;

void setup() {
  Serial.begin(9600);
  Serial.println("Starting transmission...");
  Serial.flush();
  Serial.println("Transmission finished; continuing.");
}

int main() {
  setup();
  return 0;
}
Starting transmission...
Transmission finished; continuing.

Verwenden Sie auf einem Board das von Arduino bereitgestellte Serial-Objekt und den passenden Board-Core. Der Ersatz für den Computer veranschaulicht nur, an welcher Stelle der Sequenz der Aufruf steht; er bildet weder die elektrische Übertragung nach noch überprüft er, ob ein Empfänger die erste Zeile verarbeitet hat. Für eine Prüfung mit Hardware kompilieren und laden Sie den Sketch für Ihr Board hoch und beobachten Sie ihn anschließend mit einem auf 9600 Baud eingestellten seriellen Monitor.

Worin unterscheidet sich flush() in PySerial?

In einem Python-Programm mit PySerial wartet ser.flush() ebenfalls, bis ausstehende Ausgabedaten geschrieben wurden. Die Methode gehört zum Serial-Objekt von PySerial, während Serial.flush() zu einer seriellen Arduino-Schnittstelle gehört. Beide betreffen ausgehende Daten; keine der beiden Methoden wartet für sich allein auf eine Bestätigung auf Anwendungsebene oder leert eingehende Daten.

Für eine zuverlässige Bestätigung lassen Sie Arduino eine Antwort senden, nachdem es einen Befehl ausgewertet und verarbeitet hat. Das Python-Programm kann diese Antwort dann lesen und überprüfen. Trennen Sie diesen Protokollschritt von ser.flush(): Das Leeren der Ausgabe stellt sicher, dass der Host seine ausstehenden Daten geschrieben hat; die Antwort teilt mit, was Arduino getan hat. Ein serieller Portname wie COM3 ist betriebssystemspezifisch. Stellen Sie daher Port und Baudrate passend zu Ihrer Umgebung ein.

Häufige Fragen zum Leeren serieller Ausgaben

Leert Serial.flush() den Empfangspuffer? Nein. Die Funktion wartet, bis die ausgehenden Daten vollständig übertragen wurden. Verwenden Sie die passende Logik zum Lesen des Empfangspuffers, um eingehende Bytes abzurufen.

Bedeutet eine abgeschlossene Übertragung, dass das andere Gerät die Nachricht empfangen hat? Nein. Sie bedeutet, dass die Übertragung über die lokale serielle Schnittstelle abgeschlossen ist. Daraus lässt sich nicht ableiten, ob das entfernte Gerät die Daten empfangen, ausgewertet oder verarbeitet hat. Verwenden Sie für eine solche Bestätigung eine Rückmeldung.

Wann sollte ich die Funktion aufrufen? Rufen Sie Serial.flush() auf, wenn der nachfolgende Code warten muss, bis die ausstehende Ausgabe übertragen wurde – beispielsweise bevor ein Halbduplex-Transceiver in den Empfangsmodus wechselt. Bei gewöhnlichen Protokollausgaben ist es meist nicht nötig, nach jeder Zeile ausdrücklich zu warten.

Verwendet PySerial denselben Methodennamen? PySerial stellt ser.flush() für sein serielles Verbindungsobjekt bereit. Die Methode dient einem ähnlichen Zweck für ausgehende Schreibvorgänge, ist aber eine separate API und nicht mit Serial.flush() von Arduino identisch.