Wie zu erfassen, eine serielle Schnittstelle, die verschwindet, weil das usb-Kabel wird ausgesteckt
Habe ich eine c# - winforms-Programm und es öffnet sich eine serielle Schnittstelle. Das problem tritt auf, wenn der Benutzer steckt den usb-Kabel und dann das Gerät verschwindet. Nachdem dieser das Programm zum Absturz, und möchten, melden Sie den Fehler an microsoft.
Gibt es eine Möglichkeit zur Erfassung dieser Veranstaltung und ordnungsgemäß heruntergefahren?
- Hatte dieses problem auch vor langer Zeit und konnte nicht einen Weg finden, um zu verhindern, dass der Absturz. Neugierig, wenn jemand kam mit ein Weg, in der Zwischenzeit, in meinem Fall habe ich nur Links, die wie eine große offene bekanntes Problem.
- Ich glaube, dass das "Absturz-problem" wurde behoben .Net 4.0. Sobald der port nicht angeschlossen ist, ist jeder Versuch zu verwenden, der port sollte einen Fehler auslösen, die gefangen werden können.
- Wir hatten viele Probleme mit dem SerialPort-Klasse und wechselte zu SuperCom (siehe adontec.com). Die SuperCom NET-Bibliothek gelöst, viele Fragen. Es bietet auch eine OnPlug Ereignis, wenn USB-Seriell-ports erscheinen/verschwinden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie verwenden WMI (Windows Management Instrumentation) für die Benachrichtigung auf USB-Veranstaltungen.
Ich habe genau vor zwei Jahren, monitoring für das einstecken und ausstecken eines bestimmten usb-Geräts.
Leider ist der code bleibt bei meinem ehemaligen Arbeitgeber, aber ich fand ein Beispiel an bytes.com:
Ich erinnere mich nicht, wenn ich veränderte die Abfrage, um Ereignisse empfangen, die nur für e bestimmten Gerät, oder wenn ich gefiltert aus Veranstaltungen, die von anderen Geräten in meinem event-handler. Für weitere Informationen haben möchten Sie vielleicht einen Blick auf die MSDN WMI .NET-Code-Verzeichnis.
BEARBEITEN
Ich fand ein paar mehr Infos über den event-handler, sieht es in etwa so:
Möchten Sie vielleicht fügen Sie einige exception-handling, aber.
Ja, es ist ein Weg zur Aufzeichnung der Veranstaltung. Leider kann es eine lange Verzögerung zwischen der Zeit, wird das Gerät entfernt und die Zeit, die das Programm erhält eine Benachrichtigung.
Der Ansatz ist die trap-com-port-Ereignisse wie ErrorReceived und zu fangen, die WM_DEVICECHANGE-Nachricht.
Nicht sicher, warum dein Programm abstürzt; Sie sollten einen Blick auf den stack, um zu sehen, wo dies passiert ist.
In der registry unter:
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
ist die aktuelle Liste der ports. Wenn Ihr port verschwunden, es heißt, es war nicht angeschlossen.
Beispiel: (Versuchen Sie, entfernen Sie Ihren USB und drücken Sie die F5-Taste im Registrierungs-editor)
COM10 - Mein fax-modem
COM1 - USB - moxa usb-Seriell Konverter
COM13 - USB - Profilic-Seriell-Konverter
Hinsichtlich
Obwohl die Antworten bereits gegeben sind ein guter Ausgangspunkt, ich möchte hinzufügen einige Beispiele für .net 4.5, und auch ein Beispiel für die Erfassung einer Typ usb-Gerät.
In Treb Antwort, er verwendet die
'Win32_USBControllerDevice'
. Dies kann oder kann nicht die beste Bedingung für Ihre Abfrage, je nachdem, was Sie erreichen möchten. Die Geräte-id aus der Win32_USBControllerDevice ist einzigartig für jedes Gerät. So, wenn Sie suchen für eine eindeutige id identifiziert ein einzelnes Gerät, dann ist das genau das, was Sie wollen. Aber wenn Sie auf der Suche nach einem bestimmten Typ von Gerät, das Sie nutzen könnten'Win32_PnPEntity'
und den Zugriff auf dieDescription
Eigenschaft. Hier ist ein Beispiel, der immer eine bestimmte Typ Gerät durch seine Beschreibung:Einige links, die nützlich sein könnten für die Erforschung, auf welche Klassen Sie verwenden in Ihren sql-Anweisungen:
Win32-Klassen - Im Beispiel oben, die
'Win32_PnPEntity'
Klasse verwendet wurde.WMI-Klassen-System - Im Beispiel oben, die
__InstanceCreationEvent
und__InstanceDeletionEvent
Klassen verwendet wurden.Könnten Sie versuchen, zu behandeln
ErrorReceived
.Außerdem können Sie überprüfen, ob der port vorhanden ist, bevor Sie fortfahren. Sie Mai wollen überprüfen Sie es einmal in eine Weile, vielleicht nur vor dem Lesen/schreiben.
Sollten Sie auch
try-catch
Blöcke für alle Ihre serial-port-Operationen. Es sollte helfen, zu verhindern, dass unerwartete Kündigungen.Möchten Sie vielleicht, um zu versuchen, um die app ausführen im debug-Modus unter Ihre IDE und simulieren Sie den Fehler. Wenn eine exception werfen, Sie würden in der Lage sein zu identifizieren, wo wird das problem besonders deutlich. Von dort aus könnte Sie wahrscheinlich versuchen, um weitere spezifische Lösungen.
Wenn Ihr try-Anweisung ist nicht die exception zu fangen, dann hoffen wir, dass Microsoft prüft dann, ob die Halden.
Gibt es einige SetupDi-APIs (ich denke ... es ist schon eine Weile), die es erlauben, Sie zu beraten, der Gerät, Anreise und Umzug, aber es wird nicht helfen, wenn Sie bereits abgestürzt, weil das Gerät entfernt wurde in der Mitte des lese-oder schreib-operation.