Forum: PC-Programmierung Gerät abfragen ob am PC Angeschlossen


von Matze (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

ich habe folgendes Problem:

ich möchte ein Programm so aufwerten, dass dieses sofort erkennt ob ein 
bestimmtes Gerät angeschlossen wurde.
Ich habe es bisher so gelöst:

private void timerScanPorts_Tick(object sender, EventArgs e)
        {
            List<string> portnames = new 
List<string>(SerialPort.GetPortNames());
            picMark.Visible = portnames.Contains("COM7");
            timerScanPorts.Start();
        }

Nun ist das Problem dabei, sollte das Gerät (weil mal ein anderer USB 
Stick noch dran hängt) nicht auf Port "COM7" landen so, ist alles für 
die  "Katz" :-(

Kann ich denn die PID oder VID auslesen oder am Namen vor dem "COMxx" 
anknüpfen (Bild) ?
Wenn ja, kann mir jemand dabei helfen?

von Ralf (Gast)


Lesenswert?

> Kann ich denn die PID oder VID auslesen oder am Namen vor dem "COMxx"
> anknüpfen (Bild) ?
Würde dir m.E. nichts bringen, denn es kann auch vorkommen, dass zweimal 
das gleiche Gerät dranhängt. Auf diesem Wege müsste dann mindestens noch 
die Seriennummer (sofern vorhanden) geprüft werden - und es ist nicht 
garantiert, dass eine SN vorhanden ist.

Ich würde daher entweder alle vorhandenen Ports durchscannen und 
schauen, ob ein Wunschgerät angeschlossen ist oder rausfinden, welcher 
USB-Wandler verbaut ist und die entsprechende DLL des Herstellers 
verwenden, um mit dem Teilchen zu kommunizieren. Wenn's ein FTDI ist, 
dann geht's relativ einfach.

Ralf

von Christian R. (supachris)


Lesenswert?

Mit der Windows Setup API geht das. Entweder nach VID/PID + Seriennummer 
suchen, oder nach Namen. Du kannst dir dann auch ein Callback Event 
registrieren, dass immer dann ansprint, wenn das Device mit der 
entsprechenden Driver GUID angesteckt oder abgezogen wird. 
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363432%28v=vs.85%29.aspx

von Matze (Gast)


Lesenswert?

Hallo,

@Christian R.:
danke für den Tipp, ich werde es mal durchgehen, ob ich es verstehe.

von Matze (Gast)


Lesenswert?

Also das ist mal verdammt umfangreich.
Ich dachte eigentlich, dass es mittlerweile etwas "einfacher" 
funktioniert.
So dass ich die PID&VID einfach abfrage ob das Gerät angeschlossen ist. 
In C# gibt es sowas ja nicht wie ich gelesen hab.. :-( oder?

Grund:(den hab ich gestern vergessen zu erwähnen)

Möchte bei meinem kleinen Programm ein Text grün markieren, wenn das 
Gerät angeschlossen wird. Geht dann ja quasi mit mehreren verschiedenen 
Geräten, sofern man die PID kennt

von Frank (Gast)


Lesenswert?

- die COM-Ports kann man der Reihe nach abklappern, in RealBasic (und 
ich bin sicher, in allen anderen Programmiersprachen auch so oder so 
ähnlich), gibts die Werte "system.serialcount", "system.serial(i).name" 
usw.

- man öffnet jeden dieser Ports mit "open", geht sowieso nur, wenn nicht 
bereits durch eine andere Applikation geöffnet ...

- und man sendet eine Kommando-Sequenz. Wenn das richige Gerät dran ist, 
antwortet es brav mit einem vereinbarten Wert, der z.B. auch eine 
Seriennummer enthalten kann (Dongle-Funktion!). Ist ein "fremdes" Gerät 
dran, wird entweder Nichts oder nichts Vereinbartes zurückkommen.

von Christian R. (supachris)


Lesenswert?

COM Ports sucht man in der Registry (HKLM\Hardware\DeviceMap...), ob sie 
vorhanden sind. Das wird auch bei PnP aktualisiert. Aber das sagt ja 
noch nichts über den dahinterliegenden USB-Chip aus. Dazu müsste man 
dann wieder die SetupAPI bemühen oder im jeweiligen Zweig des 
Herstellers in der Reg suchen, welcher COM Port zu welchem USB Chip 
gehört. Auf der FTDI Seite ist dazu ein Beispiel.
Aber kompliziert ist doch die Device Register Notification nicht, in C++ 
sind das wenige Zeilen, und man muss nicht scannen sondern bekommt ein 
Event. Besser gehts doch gar nicht.

von Frank (Gast)


Lesenswert?

Ich denke, es ist vertrauenswürdiger, mit dem Gerät zu kommunizieren, 
als mit einem lokalen Treiber, der "denkt", da sei ein Gerät ...

von Ein Gast (Gast)


Lesenswert?

Frank schrieb:
> - und man sendet eine Kommando-Sequenz. Wenn das richige Gerät dran ist,
> antwortet es brav mit einem vereinbarten Wert, der z.B. auch eine
> Seriennummer enthalten kann (Dongle-Funktion!). Ist ein "fremdes" Gerät
> dran, wird entweder Nichts oder nichts Vereinbartes zurückkommen.

Was ist das für eine Unart, beim Starten irgendeines Programms auf 
irgendwelchen Ports irgendwelchen Mist zu senden. Wie willst du 
sicherstellen, dass das Gerät nicht mit ungewollten Aktionen reagiert, 
nur weil die Kommando-Sequenz zufällig im Gerät irgendetwas auslöst?

Bestes Beispiel ist Windows (XP u.a.?) allerdings in Gegenrichtung: 
Hinter jedem aufgesteckten Gerät vermutet es erstmal ein serielle Maus. 
Das führt dazu, dass zum Beispiel beim ersten Anschluß eines 
GPS-Empfängers, der nun mal unaufgefordert munter NMEA-Daten sendet, der 
Mauszeiger wildeste Tänze auf dem Desktop ausführt und der Rechner 
erstmal unbedienbar wird.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Die implizite Suche nach der seriellen Maus kann man abschalten.

von Reinhard Kern (Gast)


Lesenswert?

Abdul K. schrieb:
> Die implizite Suche nach der seriellen Maus kann man abschalten.

Na gottseidank kann man das, bloss hilft das dem Fragesteller nicht 
weiter - sein Konzept einfach ins Blaue hinein was zu senden ist damit 
ja obsolet. Wenn er das abschaltbar macht, steht er genau wieder am 
Anfang. Ein Abfrage-API für serielle Geräte gibt es schlichtweg nicht, 
also auch keine Garantie, dass eine gesendete Sequenz nicht unerwünschte 
Konsequenzen hat.

Gruss Reinhard

PS erkönnte umgekehrt seine Geräte im Leerlauf etwa alle Sekunde ein 
bestimmtes Zeichen oder eine Sequenz senden lassen, dann muss er bloss 
solange an einer Schnittstelle horchen, ob sich sein Baby meldet.

von Christian R. (supachris)


Lesenswert?

Die saubere und zuverlässige Lösung ist das Windows SetupAPI und da nach 
der Driver GUID suchen bzw. sich benachtichtigen lassen. Und dann bietet 
jedes USB Gerät die Möglichkeit einen Serial Number Descriptor zu 
hinterlegen, den kann man zusammen mit der VID/PID Kombination 
auswerten. Die anderen Lösungen sind quick&dirty hacks.

von Matze (Gast)


Lesenswert?

Hallo,

danke erstmal für die vielen Antworten und Meinugen.
Es scheint so als würde die SetupAPI die gängiste Variante sein, auch 
laut google, bing, etc...
Da ich so etwas zum ersten Mal mache, habe noch eine Frage:
Die SetupAPI ist also eine *.dll die ich in mein Projekt einbinden muss, 
um dann mit den Funktionen arbeiten zu können richtig?
Wenn ja, wie binde ich diese ein und bekomme die dll her?

Sorry für so ne Frage, aber wie gesagt, habe schon Programme mit UART 
gemacht, aber noch nie so was vom System ausgelesen.

@Ein Gast:
Ach ja, mein Device ist gesperrt für alle Funktionen wenn es am USB 
hängt, daher kann es keine komischen Sachen machen.

von ibo (Gast)


Lesenswert?

So listest du alle COM Ports die angeschlossen sind auf...

string[] ports = System.IO.Ports.SerialPort.GetPortNames();
               comboBox1.Items.Clear();
              foreach (string i in ports)
              {

                  comboBox1.Items.Add(i);
              }

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

es ist ja gerade der Sinn der Sache, virtuelle Com-Ports genauso zu 
behandeln wie "echte" (was immer das ist), damit man die Software nicht 
anpassen muss.

Man kann natürlich die USB-IDs verwenden, bloss funktioniert das eben 
mit den Original-COM-Ports nicht. Im Übrigen gibt es auch noch Com-Port 
over Ethernet (XPORT).

Gruss Reinhard

von Matze T. (timemy)


Lesenswert?

ibo schrieb:
> So listest du alle COM Ports die angeschlossen sind auf...
>

Hi ibo,

ja das stimmt, so habe ich es im moment auch. Aber damit bekomme ich ja 
nur zurück COM1, COM2, usw.
Ich möchte aber das was davor steht:
USB Serial Port (COM1)
USB Device Class10(COM2) usw.....

Trotzdem danke für die Hilfe.

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.