Warum wird der Zugriff auf den COM-Port verweigert?

9

der Code:

%Vor%

liest Shared Memory, schreibt diesen Shared Memory in Datei, dann wird dieselbe Datei mit XML Reader geöffnet und teilt XML auf, da es mehrere Roots hat, dann den Wert eines Knotens auf jedem neuen Split-XML bekommt und über Serial sendet. es funktioniert auf dem ersten Split-XML und sein Knoten wird über die serielle gesendet, dann stoppt es mit einem Zugriff verweigert wird, com-Port-Nachricht bei Versuch für den zweiten Knoten auf serielle schreiben.

Ich habe eine andere App, die ich mit demselben Seriencode gemacht habe, und es funktioniert gut (ich habe es nur müde, dann habe ich es geschlossen.) ... also ist es seltsam.

    
Csharpz 28.08.2011, 07:41
quelle

3 Antworten

22

Sie können eine serielle Schnittstelle nur einmal öffnen. Aber Ihr Code hat den Aufruf Open () innerhalb der While-Schleife. Das funktioniert nur für den ersten Durchgang durch die Schleife, Kaboom im 2. Durchgang. @ cdhowies Lösung funktioniert auch nicht, SerialPort hat eine Eigenart (alias Bug), vor der die Dokumentation warnt. Es benötigt Zeit, damit ein Worker-Thread nach dem Aufruf von Dispose () oder Close () beendet wird. Die Menge an Zeit ist nicht spezifiziert und unvorhersehbar.

Die wirkliche Lösung ist einfach: Verschieben Sie den Aufruf Open () einfach vor die while-Schleife.

    
Hans Passant 28.08.2011, 11:09
quelle
2

Zusätzlich zu Hans 'Antwort:

Ich hatte das selbe Problem und spielte ein wenig mit einigen Sleep-Zeiten zwischen dem Öffnen und Schließen der seriellen Schnittstelle. In meinem Fall waren 250 ms ausreichend. Vielleicht hilft das jemandem da draußen.

BEARBEITEN:

Ich habe meine Lösung optimiert und das ist es, was ich mir ausgedacht habe:

%Vor%

Sie können mit sleepTimeInMs und / oder maxRetries herumspielen. Ich habe diese Werte gewählt, weil sie in jedem erforderlichen Anwendungsfall ausreichend waren.

    
M. Hartner 15.06.2016 15:20
quelle
0

Hans 'Antwort ersetzt diesen; Ich verlasse es nur für Kontext und Informationszwecke.

Sie müssen den Port schließen, wenn Sie damit fertig sind. Der Garbage Collector sammelt das erste Objekt SerialPort nicht, bevor Sie versuchen, ein anderes Handle für es zu öffnen. Ändern Sie diesen Code:

%Vor%

An:

%Vor%     
cdhowie 28.08.2011 17:34
quelle

Tags und Links