Motivation

Bei vielen Projekten mit Mikrocontrollern ist eine Kommunikation mit einem PC notwendig. Meist erfolgt der Datenaustausch über eine serielle Schnittstelle. Auf dem PC muss dann ein COM-Port ausgewählt werden. Hilfreich ist außerdem zu erfahren, ob ein μC an- oder abgestöpselt wurde. Das folgende Projekt erleichtert diese Aufgaben.

2022-11-28: Dieses Projekt grundlegend überarbeitet.

Verwendung

Klasse ComPortDescriptor

Steuerelement ComPortSelector

Klasse DeviceChangedEventArgs

Klasse ComPortFoundEventArgs

Implementierungshinweise

Form-Basis UsbDetectionForm

Download

Verwendung

Das Projekt stellt drei Klassen zur Verfügung:

Die Klassendokumentation im Detail.

Klasse ComPortDescriptor

Hinweis: Die Ermittlung der verfügbaren COM-Ports erfolgt über die WMI. Das NUGET-Paket System.Management muss eingebunden werden.

Klasse ComPortDescriptor

Über die Methode GetPorts  wird eine Liste der verfügbaren COM-Ports als List<ComPortDescriptor> ermittelt und folgende Daten für jedes Element bereit gestellt:

GetPorts  besitzt den optionalen Parameter NameFilter. Wird hier ein Wert angegeben, werden nur Daten zu denjenigen COM-Ports zurück geliefert in deren Beschreibung der in NameFilter spezifizierte Text vorkommt. Mit GetPorts ("Profilic") würden nur die "Profilic"-Geräte (z.B. PL2303) ausgewählt werden.

Die Methode ToFileName liefert einen String zurück, der für die nativen Windows-Funktionen, wie z.B. OpenFile geeignet ist. Ports > 9 benötigen den Prefix '//./'.

ToString liefert eine Textdarstellung des Objekts, z.B. "Prolific USB-to-Serial Comm Port (COM24)". Dieser Wert wird zur Anzeige der Ports in dem Steuerelement ComPortSelector benutzt.

Steuerelement ComPortSelector

Control ComPort Selector  

Das Steuerelement zeigt die verfügbaren COM-Ports in Form einer ComboBox an und ermöglicht die Auswahl eines Ports. Die Elemente der Liste werden nicht automatisch gefüllt oder aktualisiert. Dazu dient die Methode UpdateList. Wird sie ohne ein Argument aufgerufen, werden die Elemente über die Methode ComPortDescriptor.GetPorts ermittelt. Der Parameter NameFilter wird dabei übergeben. Will man die Elementeliste weiter beeinflussen, kann man UpdateList eine Liste der ComPortDescriptor-Objekte übergeben, die angezeigt werden sollen. Angezeigt werden die in ComPortDescriptor.DisplayName hinterlegten Texte.

AutoSelect = true (Voreinstellung) bewirkt, dass, wenn die Elementeliste nur ein Element enthält, dieses direkt selektiert wird.

Nach Aufruf der Methode UpdateList des ComPortSelector-Steuerelements wird zunächst der NameFilter-Parameter ausgewertet. Für alle gefundenen und dem NameFilter entsprechenden Ports wird das Ereignis ComPortFound aufgerufen. Dort kann der DisplayName überarbeitet werden (Im Beispiel wird die Seriennummer angefügt). Ports können aus der Liste ausgeschlossen werden, indem AddDeviceToList im ComPortFoundEventArgs-Argument auf false gesetzt wird.

DeviceAdded und DeviceRemoved werden ausgelöst, wenn ein neues USB-Gerät ein- bzw. abgeschaltet wird. Leider lässt es sich einfach erkennen, ob es sich bei dem Gerät um einen Com Port handelt. Im Beispiel wird darauf einfach mit einem Aufruf von UpdateList reagiert.

DropDown wird ausgelöst, bevor die DropDown-Liste angezeigt wird. Hier besteht noch einmal die Chance, die Anzeige zu beeinflussen.

Das Ereignis SelectionChanged wird ausgelöst, wenn ein Element selektiert wurde.

Klasse DeviceChangedEventArgs

DeviceChangedEventArgs

ComPortName enthält den COM-Port-Namen, z.B. "COM24". DeviceID die eindeutige windows-interne ID des Geräts, z.B. "USB\VID_067B&PID_2303\6&F9BED0F&0&4". Die Formatierung ist identisch mit der im Feld ComPortDescriptor.DeviceID und kann mit dieser verglichen werden.

Klasse ComPortFoundEventArgs

DeviceChangedEventArgs

Über AddDeviceToList kann festgelegt werden, ob das zugehörige Gerät in die Liste aufgenommen wird.

ComPortDescriptor enthält die Daten des gefundenen Geräts. Das Feld DisplayName, das zur Anzeige in der DropDowbBox herangezogen wird, kann hier überarbeitet werden.

Implementierungshinweise

Form-Basis UsbDetectionForm

Form UsbDectectionForm

ComPortSelector erstellt ein Fenster vom Typ UsbDetectionForm, zeigt es aber nicht an. Dieses Fenster dient dazu, die Systemmeldungen über hinzugefügte oder entfernte USB-Geräte zu fangen und an das Steuerelement weiter zu geben.

Download

Das Visual-Studio-2022-Projekt  UrsComPortExtensions zum Download.