Ist es sicher, gleichzeitig über verschiedene Threads (einen Lese- und einen Schreib-Thread) auf eine serielle Schnittstelle zu lesen und zu schreiben? Wäre es notwendig, in jedem Thread ein Locking um Lesen / Schreiben hinzuzufügen?
Aus der Dokumentation von SerialPort :
Alle öffentlichen statischen Member (Shared in Visual Basic) dieses Typs sind threadsicher. Alle Instanzmitglieder sind nicht garantiert threadsicher.
Da Lesen und Schreiben nicht statisch sind, wären sie nicht threadsicher. Es ist in jedem Fall eine sehr schlechte Idee, da die SerialPort-Klasse interne Puffer für Sie bereithält.
Sie müssen Ihre E / A mit Ihrer seriellen Schnittstelle synchronisieren.
Das gleichzeitige Lesen und Schreiben von verschiedenen Threads auf den seriellen Port ist eine Standardmethode für die Kommunikation mit seriellen Ports: Ein Thread übernimmt das Lesen und ein Thread das Schreiben. Akzeptabel.
Es gibt eine Reihe serialbasierter Geräte, die Daten asynchron an den Host-Computer senden und dennoch Befehle an das Gerät selbst senden können: Geräte wie Barcode-Scanner, Tag-Scanner und Kameras.
Probleme?
Probleme treten auf, wenn Sie versuchen, die Kommunikation zwischen dem Gerät und dem Gerät zu synchronisieren.
Sie möchten beispielsweise einen Befehl schreiben und dann sofort eine Antwort zurücklesen. Nun, in diesem Fall würden Sie den Lese-Thread anhalten und manuell nach dem Schreiben des Befehls alle Daten des seriellen Ports ablesen. Nachdem der Befehl verarbeitet wurde, kann der Lese-Thread erneut gestartet werden.
Zusammenfassung
Im Allgemeinen würde ich vorschlagen, nur einen zusätzlichen Thread zu haben, der das Lesen von Port-Daten verarbeitet und Ereignisse wie DataReceived
auslöst und all Ihre Schreibvorgänge von Ihrem Haupt-Thread ausführt.
Ich würde den spezifischen Fall erwarten, den Sie beschreiben, mit 1 Lese- und 1 Schreib-Thread, um sicher zu sein.
Die Read- und Write-Kanäle auf der Hardware sind für den Vollduplexbetrieb ausgelegt, und die Software sollte auch so ausgelegt sein.
Und obwohl ich keine explizite Aussage dazu finden konnte, das Beispiel auf der MSDN Seite für den SerialPort schreibt auch aus dem Haupt-Thread, während es auf einem anderen liest. Ohne zu sperren.
Tags und Links .net c# serial-port