Forum: PC-Programmierung Serial via Usb unter Windows


von Klaus (Gast)


Lesenswert?

Hi all,

wie kann man erkennen, ob ein "klassischer" Com-Port oder ein
Serial_Via_Usb-Adapter am Pc angeschlossen ist bzw. verwendet wird?

Gibt es eine Möglichkeit, dieses heraus zu bekommen (evtl. via 
API-Funktionen)?

Betriebssysteme: Windows XP, Windows Vista, Windows 7
Programiersprachen: Vb6, C#, Vb.net


Viele Dank
Klaus

von malzu (Gast)


Lesenswert?

Hallo,

also ich habe gerade zwei dieser Teile bei mir angeschlossen und diese 
dann auch noch über eine Brücke miteinander verbunden, damit ich mit mir 
selbst kommunizieren kann. Beide werden im Geräte-Manager angezeigt. 
Einfach Windows Pause drücken und dann unter Hardware den Geräte Manager 
anklicken. Dort kannst du dann "Anschlüsse (COM und LPT)" erweitern. Bei 
mir werden die Anschlüsse dann als "USB Serial Port (COMx)" angezeigt.
Ich hoffe das war was du gesucht hast.

Viele Grüße
malzu

von Klaus (Gast)


Lesenswert?

Hi malzu,

sorry das ich mich ungenau ausgedrückt habe.

Leider ist Deine Methode nicht das was ich brauche.

Ich habe ein selbst geschriebenes Programm. Dieses Programm soll nun
erkennen, ob der angeschlossene Com-Port ein "klassischer" oder ein
"serial via usb" ist.

Beispiel: Vb6
  Ich verwende das MScomm32.ocx. Dieses Ocx kann zwar Com 1 bis 16 
handeln,
  aber es erkennt (leider) nicht das oben geforderte.

Beispiel: C# bzw. vb.net
  Ich verwende System.IO.Ports.SerialPort . Auch hier erkenne ich nicht, 
ob
  ich einen "klassischen"- oder "serial via usb"-Port verwende.

Ich habe bis heute nicht herausbekommen, wie ich an diese Information
heran komme.

Bye
Klaus

von Uwe .. (uwegw)


Lesenswert?

Eigentlich ist das auch der Sinn der Sache: aus Sicht der Anwendung und 
der angeschlossenen Geräte soll man möglichst keinen Unterschied zu 
einer "echten" RS232 merken...

von Justus S. (jussa)


Angehängte Dateien:

Lesenswert?

du könntest mal in die registry schauen...dort stehen unter
hkey_local_machine/hardware/devicemap/serialports
die im Moment vorhandenen Ports, und bei mir kann man anhand vom Namen 
zwischen "echtem" und virtuellem Port unterscheiden...

von Matthias (Gast)


Lesenswert?

> Eigentlich ist das auch der Sinn der Sache: aus Sicht der Anwendung und
> der angeschlossenen Geräte soll man möglichst keinen Unterschied zu
> einer "echten" RS232 merken...

Eigentlich ja, aber da das USB das Timing etwas "verbastelt" (wegen dem 
USB Polling), muss man u.U. Timeouts oder das Protokoll abhängig vom 
Port (USB oder interner) anpassen.

Oder man macht sich als Programmierer das Leben einfach und öffnet nur 
ein
Fenster "Dies ist leider kein kompatibler COM Port" -> "Tschüss" ;-)

von Klaus (Gast)


Lesenswert?

Hi Ihr,

klar Uwe, du hast normalerweise Recht.
Der Anwendung sollte (muss) es egal sein, welche "ComPort-Art" sie 
verwendet.
Leider macht das USB immer wieder Timming Probleme.


Justus, diese Methode verwende ich zum Erkennen der angeschlossenne 
Com-Ports bei dem VB6-Programm.
Leider kann ich den bei mir eingetragenen Namen,
z.B. \Device\Serial0 oder \Device\F5U103UD0 oder \Device\Nmserial1,
nicht eindeutig auf auf einen klassischen oder serial-via-usb Port
schliessen.

Bye
Klaus

von Christian R. (supachris)


Lesenswert?

Andere Möglichkeit wäre für die bekannten Kandidaten FTDI, Silabs und 
Prolific die entsprechenden Registry-Zweige zu (durch)suchen und zu 
schauen, ob die virtuellen COM da drin sind. Bei FTDI wäre das der 
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\FTDIBUS Zweig, in dem 
alle installierten FTDI Devices aufgelistet werden. Da stehen in den 
Untereinträgen auch die zugeordneten COM drin.

von Arc N. (arc)


Lesenswert?

Hab den Quellcode hier nicht vorliegen, daher nur eine grobe 
Beschreibung (Rest siehe Links)

// GUID erzeugen
SetupDiClassGuidsFromName("Ports", ...)
// die entsprechenden Informationen besorgen
SetupDiGetClassDevs(...)
// Aufzählen
SetupDiEnumDeviceInterfaces(...)
// Untersuchen
SetupDiGetDeviceInterfaceDetail(...)

Bei der letzten Funktion kommt dann auch ein DevicePath raus der bei 
USB->Seriell-Wandlern mit \\?\usb beginnen sollte.

http://www.naughter.com/enumser.html
http://stackoverflow.com/questions/571229/why-do-some-devices-not-enumerate-with-setupdigetdeviceinterfacedetail

von Klaus (Gast)


Lesenswert?

Hi All.
Merci für die schelle Antwort.
Arc Net ich werde die Api-Funktionen mal testen.

Bye
Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.