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?
> 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
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
Hallo, @Christian R.: danke für den Tipp, ich werde es mal durchgehen, ob ich es verstehe.
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
- 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.
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.
Ich denke, es ist vertrauenswürdiger, mit dem Gerät zu kommunizieren, als mit einem lokalen Treiber, der "denkt", da sei ein Gerät ...
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.
Die implizite Suche nach der seriellen Maus kann man abschalten.
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.
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.
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.
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); }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.