Laden...

Bestimmten COM Port anhand der Beschreibung im Gerätemanager erkennen

Erstellt von zoniq vor 16 Jahren Letzter Beitrag vor 12 Jahren 9.297 Views
Z
zoniq Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren
Bestimmten COM Port anhand der Beschreibung im Gerätemanager erkennen

Hallo,

ich suche nach einer Möglichkeit in meinem Terminalprogramm nur bestimmte COM Ports als Verbindungsmöglichkeit zu erlauben.
Ich möchte da ganz gerne die "COM-Port Namen" wie sie im Windows Gerätemanager angezeigt werden nach einem bestimmten String filtern und nur diese dann als Auswahlmöglichkeit in meine GUI einbinden.

Hat mir vielleicht jemand ein paar Hints (Stichworte, URLs, etc.).

Vielen Dank

K
124 Beiträge seit 2006
vor 16 Jahren

hallo zoniq,

SerialPort.GetPortNames() liefert dir ein string array, welches die Namen (zb "COM2") aller verfügbaren seriellen Ports enthält

Z
zoniq Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Hey kaloon,

danke für die schnelle Antwort. Aber ich glaube ich habe mich etwas falsch ausgedrückt. Ich will eigentlich nicht nach "COM1, COM2, ..." filtern, sondern, im konkreten Fall, nach "CP210x USB to UART Bridge Controller", welcher jedes mal auf einem anderen COM Port liegen kann. Mir geht es darum, dass den Nutzern dann nur dieser COM Port angezeigt wird.

K
124 Beiträge seit 2006
vor 16 Jahren

hey zoniq,

Aber ich glaube ich habe mich etwas falsch ausgedrückt. Ich will eigentlich nicht nach "COM1, COM2, ..." filtern, sondern, im konkreten Fall, nach "CP210x USB to UART Bridge Controller", welcher jedes mal auf einem anderen COM Port liegen kann.

sry, aber ich weiß jetzt leider nicht wie du diese bezeichnung bekommst. die SerialPort klasse bietet glaube ich keine entsprechenede methode - möglich sein sollte es allerdings, schon, immerhin wird die bezeichnung ja auch im device manager angezeigt 🙂

Z
zoniq Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Sonst jemand 'ne Idee?

I
1.739 Beiträge seit 2005
vor 16 Jahren

Idee?
Ja, benutz die API(am besten Die vom Wunsch-OS).
Das erlaubt guten Zugrifff...
Blöd ist nur, du sprichts von COM-Ports. erzähl mal welche .Net-version Dir nicht vorhabdebe Probleme beschert.
Möglicherweise(anscheinend) sprichst du von deinem Terminalprogramm aber nicht von Programmierung.

Z
zoniq Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Ikaros: Deiner Antwort konnte ich leider nicht viel geistigen Nährwert entnehmen.

Ich benutze aktuell .NET 2.0
Der Zugriff auf die COM Ports ist nicht das Problem, sondern der Zugriff auf die Information, welche mir der Gerätemanager über die COM Ports (bzw. angeschlossenen Geräte) anzeigt.
Das mir die API das ermöglich ist schon klar. Die Frage ist nur wie. Und wenn ich die Antwort darauf wüsste oder bei meinen Recherchen gefunden hätte, würde ich nicht fragen.

I
1.739 Beiträge seit 2005
vor 16 Jahren

Ok, folgendes Problem:
-Du liest die Geräte aus(WMI oder Win-Api, bsp. auf Codeproject).
-Du findest deinen MultiportController(schön)
-Du findest die Portliste
Dann beginnen die Probleme:
Oft aber nicht immer kann die Zugehörigkeit zum Controller herausfinden, anhand der Bezeichnung. Befinden 2 gleiche UART-Controller im Rechner sinkt die Wahrscheinlichkeit die Ports des zugehörigen Controllers zu erraten nochmals.
Aus den gegebenen Informationen ist es halt etwas schwierig zu erfahren welcher Treiber auf welchen aufsetzt.
Das geht nur über die Beschreibung, andere Daten gibt es nicht.

Bei einer einfachen Sicht(eine Karte) kann man sagen: alles über COM2 ist "meins". Blöderweise funktioniert das nicht wenn jemand auf die Idee kommt virtuelle Treiber(Com-Sharing, Com über TCP/IP) zu installieren.
Die Möglichkeit über die Bezeichnungen die Ports einer Karte zuzuordnen(die bisher mir als einzige Lösung bekannte) ist halt verdammt unzuverlässig.

S
2 Beiträge seit 2011
vor 12 Jahren

Hallo,
ich habe genau das gleiche Problem, mit den Antworten hier kann ich nichts anfangen. Auch in anderen Foren leider nichts gefunden.
Ich bräuchte bitte eine Lösung (keinen Verweis auf Win API) möglichst als Code, wie ich die Portnamen bzw. Treibernamen aus dem Gerätemanager abfragen kann. Also genau die Einträge im GM unter** "Anschlüsse (COM und LPT)"** um einen oder mehrere eigene Treiber zu finden und nur diese zu verwenden und über Liste auswählbar zu machen, also kein GetPortNames!

Unter der SerialPort Klasse passt da leider nichts. In der Registry steht unter
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM auch nur "\device\VCPO = COM4".

Vielen Dank
Steffen

M
1.439 Beiträge seit 2005
vor 12 Jahren

Die Namen sowie weitere Eigenschaften kannst du mit Hilfe der SetupAPI rausfinden. Ich würde dir aber trotzdem raten, die ganzen USB<->Seriel Wandler nicht mehr zu verwenden, sondern einen eigen µC mit USB. Dies bedeutet zwar am Anfang Mehraufwand, zahlt sich aber bald aus.

S
2 Beiträge seit 2011
vor 12 Jahren

Hallo,
wir entwickeln nicht das Gerät, die Vorgabe ist nun mal ein virtueller Comport. Leider habe ich auch keine Ahnung mit der SetupAPI, bin auch kein C# Programmierer und muss das schnell nebenher mal machen, nur um den Port auszuwählen und zu initialisieren! Gibt es vielleicht wo einfache Lösungen mit der SetupAPI? Über die FDTI DLL ist das auch zu aufwendig. Vielen Dank
Steffen

F
10.010 Beiträge seit 2004
vor 12 Jahren

Schau doch mal was du in der Registry per

RegistryKey rootKey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\\FTDIBUS");

bekommst.
Und wenn du den Namen dann da gefunden hast kannst du unter

RegistryKey rootKey = Registry.LocalMachine.OpenSubKey("HARDWARE\\DEVICEMAP\\SERIALCOMM");

Schauen ob der aktuell aktiv ist.

309 Beiträge seit 2008
vor 12 Jahren

Hallo,
die WMI-Klasse (Namespace System.Managment) "Win32_SerialPort" , liefert alles was du brauchst.
Die Property Name liefert den Namen der auch im Gerätemanager angeben istz.B. "Kommunikationsanschluss (COM1), und DeviceID z.B. dann nur den Anschlussnamen (COM1=

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}