3 Stimmen

Verwendung von SerialPort.BytesToWrite

Wenn SerialPort.Write() eine blockierende Operation ist (oder ist sie das nicht?), wozu braucht man dann die Methode BytesToWrite()? Sie würde immer zu Null ausgewertet werden, da die letzte Write-Operation entweder erfolgreich war und alle Daten geschrieben hat oder fehlgeschlagen ist; in beiden Fällen wären die zu schreibenden Bytes Null.

Vielleicht steckt mehr dahinter als das, was ich beschrieben habe.

4voto

Tergiver Punkte 13761

SerialPort.Write ist eine blockierende Operation, ja. Es gibt jedoch zwei Puffer, die zu berücksichtigen sind: Das serielle Gerät und der SerialPort Puffer.

Wenn die SerialPort Objekt als Puffer konfiguriert ist, wird der Schreibvorgang nur blockiert, wenn nicht genügend Platz im Puffer vorhanden ist. Es wird so lange blockiert, bis der Puffer so weit geleert ist, dass die neuen Daten hineinpassen. Andernfalls füllt es den Puffer und kehrt zurück.

Wenn die SerialPort Objekt nicht gepuffert wird, blockiert der Schreibvorgang nur so lange, wie es dauert, die Daten an das serielle Gerät zu übertragen. Dieses Gerät verfügt über einen eigenen Puffer(*), so dass die Blockierung weit weniger Zeit in Anspruch nimmt als die Übertragung der Daten.

SerialPort.BytesToWrite umfasst sowohl Daten im Puffer des Geräts als auch Daten in der SerialPort Puffer des Objekts.

(*) Ältere UARTs hatten keine Puffer, neuere haben welche, können aber so konfiguriert werden, dass sie nicht puffern.

2voto

Hans Passant Punkte 894572

Serielle Schnittstellen sind sehr langsame E/A-Geräte, die noch aus der Steinzeit der Datenverarbeitung stammen. Bei einer üblichen Baudrate von 9600 Bits pro Sekunde können sie nur etwas weniger als tausend Bytes pro Sekunde übertragen. Im Vergleich zu einer Festplatte ist eine Burst-Geschwindigkeit von 60.000.000 Byte pro Sekunde möglich. Oder vergleichbar, eine Netzwerkkarte kann 125.000.000 Bytes pro Sekunde übertragen.

Der Treiber für die serielle Schnittstelle führt also einen Puffer, in dem die von Ihnen geschriebenen Bytes gespeichert werden, und leert diesen langsam, während sie vom UART-Chip geschrieben werden. Dieser Puffer ermöglicht es dem Write()-Aufruf, schnell zurückzukehren. Da er so langsam ist, sollten Sie darauf achten, wie voll der Puffer ist, damit Sie ein Blockieren des Write()-Aufrufs vermeiden können. WriteBufferSize - BytesToWrite gibt an, wie viel Platz in diesem Puffer verfügbar ist.

1voto

Security Hound Punkte 2508

Die Eigenschaft SerialPort BytesToWrite Ermittelt die Anzahl der Datenbytes im Sendepuffer.

Andererseits ist die Methode SerialPort Write(string text) Schreibt die angegebene Zeichenkette an den seriellen Anschluss.

Sie wissen doch, wie eine serielle Schnittstelle funktioniert, oder? Eine serielle Schnittstelle sendet eine bestimmte Anzahl von Bytes pro Sekunde, abhängig von der verwendeten Baudrate.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X