mit einem COM-Port - Schließen Sie nach jeder Verwendung oder lassen Sie immer offen?

8

Bis jetzt habe ich geöffnet, als ich Daten senden musste, und sofort geschlossen. Ich bekomme zufällige "Access to Port" -Fehler (obwohl ich den Port immer wieder schließe, nachdem ich ihn benutzt habe), also dachte ich mir, es vielleicht immer offen zu lassen.

Was ist der richtige Ansatz für die Verwendung, unter der Annahme, dass ich jede Minute oder zwei Daten in einigen COM-Ports senden muss?

Danke ..

    
Itay 27.05.2013, 16:57
quelle

3 Antworten

8

Das häufige Aufrufen von SerialPort.Close () ist ein Fehler. Eine andere App zu haben, um den Port von dir zu stehlen, ist nicht gerade sehr wünschenswert. Problematisch ist jedoch, dass Close () nicht auf einen Worker-Thread wartet, der von SerialPort zum Beenden gestartet wird. Dieser Worker-Thread löst die Ereignisse DataReceived, PinChanged und ErrorReceived aus. Es dauert "eine Weile", bis es beendet wird, könnte zwischen Millisekunden und Sekunden liegen. Der Aufruf von Open () wird erneut fehlschlagen, bis das erledigt ist.

Es ist ein Fehler in der Klasse, aber durch die allgemeine Verwendung für serielle Ports verursacht. Apps schließen sie normalerweise nicht, bis die App beendet wird. Niemals einbinden, um ein häufiges Deadlock-Szenario zu vermeiden. Beachten Sie, dass der MSDN-Artikel für Close darüber warnt:

  

Die beste Vorgehensweise für eine Anwendung besteht darin, nach dem Aufrufen der Close-Methode einige Zeit zu warten, bevor Sie versuchen, die Open-Methode aufzurufen, da der Port möglicherweise nicht sofort geschlossen wird.

    
Hans Passant 27.05.2013, 17:12
quelle
1

Es ist sehr schädlich, einen seriellen Port offen zu lassen, also ja, halten Sie ihn offen. Es spart Ihnen den Overhead des Öffnens / Schließens.

    
Tralli 27.05.2013 17:05
quelle
1

Wenn Sie sich Sorgen um das Öffnen / Schließen und andere Apps machen, können Sie den von MS für den GPS-Intermediate-Treiber in eingebetteten Fenstern verwendeten Ansatz verwenden und einen Aggregator schreiben, von dem der Port geöffnet wird open stellt dann Verbindungspunkte für andere Apps bereit, mit denen eine Verbindung hergestellt werden kann.

Wie Sie die Verbindungen erstellen, bleibt Ihnen überlassen, Sie können tief in die Hardware einsteigen und einen virtuellen COM-Port-Treiber schreiben, der freigegeben werden kann, oder Sie können tun, was ich getan habe und einen einfachen win32-Socket-Dienst schreiben, der dies erlaubt Client-Programme, um über normale Windows-Socket-Verbindungen zu verbinden.

Vielleicht keine einfache Antwort, aber definitiv Denkanstoß.

    
shawty 27.05.2013 19:02
quelle

Tags und Links