SerialPort.GetPortNames() Verhalten
In meinem C# 2008-Anwendung, ich verwende den SerialPort.GetPortNames () - Funktion zum abrufen der Liste der aktuell verfügbaren ports. Was mir auch aufgefallen ist, wenn ich stecken in einem USB-Gerät, es ist die port Nummer, die ich s in der Liste angezeigt, auf meine Bewerbung und wenn ich ziehen Sie es, und aktualisieren Sie die Liste der port-Nummer ist nicht mehr da.
Einer phase der Applikation, beinhaltet das Lesen/schreiben von Daten von/zum Gerät kontinuierlich. Nun, meine Erwartung ist, Wenn ich ziehen Sie das Gerät während des Betriebes und Holen Sie sich die aktuellen Port-Liste mit SerialPort.GetPortNames(), der Port-Name wird nicht da sein und ich kann es nutzen, um die Entscheidung treffen, dass das Gerät angeschlossen wurde.
Zu meiner überraschung, der Port-name wird noch gefunden, obwohl er es entfernt
Warum ist das Programm verhält sich wie das? Der port-name in der Liste nicht aufgeführt, wenn in der keine-Kommunikation-Modus. Hat es etwas damit zu tun haben das Gerät entfernt, wenn es kommunizieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, du meinst System.IO.- Ports.SerialPort.GetPortNames(), weil ich nicht finden konnte, ein GetPortList () - Funktion überall. MSDN sagt: "Wenn die Registrierung enthält veraltete oder anderweitig fehlerhafte Daten, dann ist die GetPortNames-Methode werden falsche Daten zurück", so das ist wahrscheinlich, wo das problem liegt. Ich denke, dass Windows nicht aktualisieren Sie die Registrierung, wenn der port wird immer noch als 'verwendet', wie Sie können nicht eine Datei löschen, wenn ein Programm ein handle auf Sie.
Wenn Sie möchten, um zu testen, ob das Gerät entfernt wird, können Sie dies tun, mit einem Fenster-API-Aufruf (http://www.pinvoke.net/default.aspx/user32/RegisterDeviceNotification.html). Hoffe, das hilft!
Du haben reden SerialPort.GetPortNames(), "GetPortList" macht keinen Sinn. Die Funktion iteriert Werte in die registry geschrieben, es von Ihrem USB-emulator-Treiber. Sie können einen Blick-sehen mit Regedit.exe navigieren Sie zu HKLM\Hardware\DeviceMap\SerialComm. Ziehen Sie es, drücken Sie die F5-Taste, wenn der COM-port ist dann noch da SerialPort nicht besser weiß als der Anschluss noch vorhanden ist.
Gibt es keine vorgeschriebenen Verhalten, wie ein serial port device driver sich Verhalten soll, wenn der port plötzlich verschwindet. Serielle Schnittstellen sind sehr primitiv, Sie datieren zurück in eine Zeit, wo "bug" gemeint, der falter Verkleben der Fernschreiber. Es gibt keine hardware-Unterstützung für Plug-and-Play, entfernen der port mit eingeschalteten entspricht trennen Sie das Laufwerk während Windows austauschen, um die paging-Datei.
Meisten device-Treiber liefern einen Fehlercode zurück, es erzeugt ein uneinholbar Ausnahme, stürzt Ihr Programm ab. Das Thema dieses feedback Artikel. Anscheinend ist der Gerätetreiber nicht tun, was sollte besser sein, das über die Bombardierung Ihres Programms. Förderung btw, die meisten USB-emulator-device-Treiber sind völliger Schrott.
Die ultimative Abhilfe ist einfach: setzen Sie eine Markierung auf dem Stecker "nicht trennen, während im Einsatz!" Es ist irgendwie ein problem mit USB, die meisten Menschen schauen ihn sich an und gehen, "hmm, was kann ich tun?". Und kommen auf die einzige Antwort, und ziehen Sie es. Nach ein paar kabooms, Sie lernen die das nicht mehr.
Es ist richtig, dass
GetPortNames()
liest die ports über die Registry-SchlüsselDiese automatisch aktualisiert von Windows jedes mal, wenn ein port geöffnet ist oder geschlossen.
Aber dennoch hat es mir passiert ist, dass es eine nicht-existent-Port in der Registrierung aufgeführt, und auch wieder aus
GetPortNames()
. Wenn ich versuche, diesen port zu öffnen bekomme ich "Den Port XYZ nicht vorhanden".Was ist das ???
Ich jetzt herausgefunden, der Grund:
Dies geschieht immer nach der Verwendung von PortMon http://www.sysinternals.com.
Dieses tool ist buggy und lässt die Toten Hafen Herumlungern in der Registry, wenn der port geschlossen ist, während es überwacht wird.
In diesem Fall die einzige Abhilfe ist, starten Sie den computer neu.
Wie andere erwähnt haben, es ist sehr Treiber-spezifisch. Es scheint nicht zu sein, eine Möglichkeit zu überprüfen mit dem .Net-API, ob ein port zurückgegeben GetPortNames() tatsächlich existiert und gültig ist.
Als für, warum die ports Verhalten sich wie diese, habe ich festgestellt, dass einige USB-zu-Seriell-Treiber zum Absturz der Anwendung führen, wenn der port nicht angeschlossen ist, ist plötzlich.
Andere Treiber, die oft diejenigen, die nicht Abstürzen, wird der port in der Liste, bis die Anwendung schließt, dann verschwindet es. Versuch zum Lesen aus oder schreiben Sie an die veralteten port (in der Regel) zu timeouts oder Fehler. Vermutlich, um nicht zum Absturz der Anwendung, der Fahrer braucht, um die veraltete port um, während es noch in der Anwendung zu öffnen.
Wenn du einen Stecker in den port wieder, einige Fahrer sind sogar in der Lage sein, um es wieder zu Ihrer Anwendung, andere erkennt nicht den Anschluss, bis die Anwendung schließt die veralteten port. Dieses wiederherstellen der Verbindung Verhalten kann etwas gefährlich, wenn der port verschwunden, weil das Gerät neu gestartet, weil es dann plötzlich in einem anderen Staat als Ihre Anwendung erwartet, ohne einen offensichtlichen Hinweis darauf, dass es zurückgesetzt wurde. Zumindest wenn man Fehler aus der port, den Sie wissen, dass etwas passiert ist.
Habe ich auch herausgefunden, dass, wenn ich vergesse, in der Nähe des Hafens, es wird nicht aus der Liste verschwinden, bis der garbage collector wird rund um die Entsorgung der SerialPort-Objekt.