Problem mit SerialPort
Arbeite ich mit SerialPort kommunizieren (nur Lesen) mit barcode-Lesegerät.
Habe ich installiert-Treiber für den Betrieb mit dem Leser, als ob es war, angeschlossen über Com-port, wenn es ein usb-Gerät. Wenn das Gerät angeschlossen ist, eine weitere Com-port in der Liste angezeigt wird.
Das problem ist das folgende. Initialisiere ich die SerialPort-Objekt zum Lesen von barcode-Leser, aber wenn der reader nicht angeschlossen ist, ich habe keine Möglichkeit zu finalize oder dispose-SerialPort-Objekt korrekt, da der port "angeschlossen" ist nicht mehr vorhanden.
Das Ergebnis ist WinIOException, wenn das Programm geschlossen ist. Ich kann es nicht fassen, nicht nur im code, arbeiten mit der SerialPort-aber an dem Programm.cs-Ebene. Nach dem stack WinIOException geworfen wird nach den versuchen von Abschluss-und Entsorgung der SerialPort-Objekt.
Gibt es irgendwelche Ideen, wie ich arbeiten kann mit dieser situation richtig? Oder zumindest um die Ausnahme zu fangen?
Die Sache, die ich sicher wissen, ist, dass das problem nicht in diesem bestimmten Treiber; ich hätte noch eine barcode-Leser von einem anderen Hersteller (mit dem gleichen Zweck-Treiber) - die situation ist die gleiche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seufz, das ein Alter altes problem mit USB-Seriell-port-Emulatoren. Serielle Anschlüsse Geräte, die stammen aus der Steinzeit. Sie schraubte in den bus, keine Möglichkeit, Sie zu entfernen, während ein Programm verwenden, ohne Zeichnung, die Funken und der quellende Rauch. Steinzeit auch das fehlen für jede Art von plug-and-play-Unterstützung, so dass ein Programm erkennen könnte, dass das Gerät plötzlich gonzo.
Leider, die Mehrheit von der miesen Gerätetreiber, die Ihnen nacheifern, nur damit Sie verschwinden, auch wenn ein Programm den port geöffnet. Das funktioniert etwa so gut wie das Ruckeln die flash-Laufwerk aus der Steckdose, wenn Windows ist das schreiben von Dateien auf Sie. Es gibt eine hintergrund-worker-thread, der wartet, für Benachrichtigungen vom Gerät Fahrer, so dass es erzeugen kann, die DataReceived, ErrorReceived und PinChanged Veranstaltungen. Dieser thread erleidet einen Herzinfarkt, wenn das Gerät plötzlich verschwindet. Sie können nicht fangen, es ist ein thread, gestartet von der SerialPort-Klasse, kann man nicht wickeln Sie es mit try/catch.
By popular demand, Microsoft hat etwas über es in .NET 4.0. Nicht wirklich sicher, was in diesem release. Wenn Sie stecken bleiben auf einem früheren release, das einzig vernünftige, was Sie tun können, ist, kleben Sie ein Zeichen neben dem USB-Steckplatz: "nicht zu entfernen, während Sie verwendet!" Unweigerlich macht sich jemand trennen Sie das Gerät mindestens zweimal, um zu sehen, was passiert. Nach dem Sie gelangweilt mit, und lassen Sie Sie in Frieden.
Den sehr unvernünftig Problemumgehung ist eine app.exe.config Datei mit diesem Inhalt:
Verwenden Sie es nicht.
In meinem code, dies geschieht als Teil der
Finalize()
Methode auf die BaseStream, die vom garbage collector aufgerufen.Als solche, wenn man erbt das .NET SerialPort-Klasse und überschreibt die Öffnen /Schließen, können Sie Folgendes tun:
Während der Öffnen, rufen Sie einfach
GC.SuppressFinalize(Me.BaseStream)
Während der close, versuchen Sie, rufen Sie
GC.ReRegisterForFinalize(Me.BaseStream)
Wenn der USB wurde herausgezogen, dadurch wird eine exception werfen, jammern über den Zugang zu den BaseStream. Entweder prüfen Sie die
.IsOpen
Eigenschaft vor dem Aufruf derGC
oder wickeln Sie es in einTry
Catch
wenn Sie nicht Vertrauen.IsOpen
False zurückgeben, jedes mal...Werde, Sortieren Sie es aus, Ihre Anwendung mit der Tatsache, dass es schon herausgezogen, und es wird nicht Abstürzen, wenn Sie in der Nähe.
Ich bin derzeit nicht in der Lage, um es dann wieder zu öffnen, den port, wenn es wieder eingesteckt, aber zumindest gibt es da einige Fortschritte über ein label sagen: don ' T touch...
SafeSerialPort
Objekt (das, was ich namens der Klasse, die stammt ausSerialPort
) und versucht, sich zu verbinden. Wenn es nicht gelingt, ruft es Nahe, darüber zu Verfügen, und setzt die variable wieder auf null wieder. Funktioniert einwandfrei. Jedoch, das Gerät & Treiber, die Sie verwenden können, Verhalten sich anders.Können Sie Erben von SerialPort und überschreiben Sie die Dispose () - Methode zur Behandlung solcher Ausnahmen. Sie können nur fressen die Ausnahme (Entsorgen Sie sollten nicht werfen sowieso).
Wenn Sie möchten, melden Sie die Ausnahme oder Griff es auf eine andere Weise, Sie haben zu prüfen, die Entsorgung Flagge zuerst. Wenn es false ist, bedeutet es, dass Dispose aufgerufen wurde von SerialPort ' s destructor und das Objekt ist bereits verwaist.
E. g.
Löste ich dieses problem durch die Schaffung einer separaten Prozess behandelt die serielle Schnittstelle. Wenn die serielle Schnittstelle nicht angeschlossen ist, ich den Prozess starten. Jetzt kann ich wieder zu einem unplugged-serial-port-Gerät ohne Neustart der Hauptanwendung.
Beispiel-code
Serielle Schnittstelle Prozess-code
Hauptanwendung
Gut, schlechte Nachrichten.
Lösung von Panagiotis Kanavos nicht helfen. Das problem ist immer noch da.
.Net 4.0 nicht helfen, entweder. Ich habe VS2010 installiert - hat sich nichts geändert. Die unhadled Ausnahme ist noch geworfen. Leider "kleben Sie ein Zeichen neben dem USB-Steckplatz: "nicht zu entfernen, während Sie verwendet wird!" scheint die einzige Entscheidung, die...
Habe ich die gleiche Erfahrung gemacht. Es ist zwar nicht empfohlen, Sie können ziehen Sie und plugin ein serielles Gerät an einen tatsächlichen seriellen Anschluss und die Kommunikation wird wieder beginnen. Ein USB-Seriell-port funktioniert nicht auf diese Weise. Ich habe auch das problem das der USB serial port " erscheinen nicht als einen verfügbaren Anschluss der SerialPort.GetPortNames () - Methode erst nach den virtuellen seriellen port instanziiert wird von der software.