Ich muss von einer Prüfsoftware aus 20 Messplätze ansteuern können, die
sich in einer Gerätefertigung befinden. Es werden gleichzeitig 20 Geräte
mit der Applikation überprüft. Die Geräte kommen mit einem Fließband
quasi automatisch in die Messplätze und haben eine optische serielle
Schnittstelle, für die es USB-Adapter gibt.
Der optische Kopf kommt auf das zu prüfende Device. Der USB Stecker
erzeugt einen virtuellen COM Port (Silicon Labs Chip CP210X). Über die
COM Schnittstelle kann ich dann mit der Prüfsoftware seriell
kommunizieren.
Da jedes Gerät individuell angesteuert wird, muss ich wissen, welcher
COM-Port (COM5, COM6, COM7, ...) mit welchem Messplatz (1...20)
verbunden ist. Das darf sich natürlich nicht ändern, wenn man den
Prüf-PC über Nacht bootet, etc...
1. Frage: Habe ich Einfluss darauf, welcher virtuelle COM Port für einen
bestimmten Adapter Vergeben wird? Ich denke, dass das das
Betriebssystem(Windows) kontrolliert, bin mir aber nicht sicher.
2. Ich habe festgestellt, dass die Adapter alle die gleiche USB
Seriennummer haben. Auch da bin ich nicht sicher, aber ich denke, dass
weder Windows noch der Gerätetreiber wissen kann, um welchen
individuellen Adapter es sich handelt. Ich kann die Adapter zwar
nacheinander hineinstecken, und dann schauen, welchen Port sie zugewisen
bekommen, glaube jedoch nicht, dass diese Konfiguration den nächsten
re-Boot überleben würde.
Wie gehe ich hier einigermaßen professionell vor um eine stabile und
"deterministische" Zuweisung zu bekommen?
Danke!
Michael W. schrieb:> Wie gehe ich hier einigermaßen professionell vor um eine stabile und> "deterministische" Zuweisung zu bekommen?
Verpasse mit dem Tool des Herstellers jedem USB Serial Wandler eine
eindeutige ID, dann kannst du über die Registry auslesen welcher COM
Port diesem Gerät genau zugeordnet wurde.
Christian R. schrieb:> Michael W. schrieb:>> Wie gehe ich hier einigermaßen professionell vor um eine stabile und>> "deterministische" Zuweisung zu bekommen?>> Verpasse mit dem Tool des Herstellers jedem USB Serial Wandler eine> eindeutige ID, dann kannst du über die Registry auslesen welcher COM> Port diesem Gerät genau zugeordnet wurde.
Das habe ich vor zu tun und habe mir das Tool gerade runtergeladen.
Was ich aber noch nicht so ganz verstehe:
Angenommen ein (eindeutiges) USB gerät meldet sich erstmalig beim
Treiber an und bekommt "COM6" zugewiesen.
1)
Was würde passieren, wenn ich nun re-boote?
Bleibt das sicher auf "COM6" oder erfolgt die Zuweisung neu? Wenn du
sagst "Registry" würde ich tippen, dass es fix hinterlegt ist...
2)
Angenommen ich stecke das Gerät mit "COM6" ab. Kann es dann sein, dass
der nunmehr freie Port für ein neues Gerät verwendet wird (z.B. wenn ich
etwas anderes zwischendurch anstecke)? Wenn ich dann das ursprüngliche
Gerät wieder anstecke, wäre der "COM6" ja bereits vergeben. Oder merkt
sich das Betriebssystem, dass COM6 belegt ist, und versucht erst gar
nicht, den freien Port zu vergeben, auch wenn er gerade nicht aktiv ist?
Windows merkt sich für jeden USB-Anschluß den COM-Port.
Also einfach an den ersten Port stecken, im Gerätemanager COM1 zuweisen,
an den 2. stecken, COM2 zuweisen usw.
Wenn Du Umsetzer ohne eigene Seriennummer (z.B. Prolific) hast, wars das
schon.
Ansonsten mußt Du das Spielchen für alle Umsetzer wiederholen. Du kannst
sie aber auch nur an den vorgesehenen Anschluß stecken und zuweisen, nur
darfst Du sie dann nicht mehr vertauschen.
Warnungen, daß eine COM bereits belegt sei, kannst Du ignorieren,
solange Du nicht 2 USB-Ports die gleiche COM verpaßt. Es sollten nie 2
gleiche COMs gleichzeitig angesteckt sein.
Funktioniert das auch, wenn ich USB Hubs verwende?
Ich habe z.B. 4 USB Hubs, die ich an verschiedene USB Ports des PCs
anschließe.
Sobald ich ein USB Gerät an einen Port eines Hubs anschließe, merkt sich
Windows den hierbei generierten COM-Port ? Habe ich das richtig
verstanden?
Wann ist dann die Seriennummer wichtig?
Michael W. schrieb:> Funktioniert das auch, wenn ich USB Hubs verwende?
Ja.
> Sobald ich ein USB Gerät an einen Port eines Hubs anschließe, merkt sich> Windows den hierbei generierten COM-Port ? Habe ich das richtig> verstanden?
Nein.
> Wann ist dann die Seriennummer wichtig?
Genau dann, wenn du ein Teil mal an einen anderen Port steckst.
Es ist dabei vollkommen scheißegal, ob der Port direkt am Rechner ist
oder an irgendeinem verschissenen Hub.
Hat das Ding eine eindeutige Seriennummer, wird es auch wieder den
gleichen COM-Port zugewiesen bekommen. Ansonsten nicht, dann ist es für
Windows ein neues Teil und bekommt die nächste "freie" Com-Port-Nummer
zugewiesen.
Diese simple Logik kann doch nicht so schwer zu begreifen sein?
Michael W. schrieb:> Christian R. schrieb:>> Michael W. schrieb:>>> Wie gehe ich hier einigermaßen professionell vor um eine stabile und>>> "deterministische" Zuweisung zu bekommen?>>>> Verpasse mit dem Tool des Herstellers jedem USB Serial Wandler eine>> eindeutige ID, dann kannst du über die Registry auslesen welcher COM>> Port diesem Gerät genau zugeordnet wurde.>> Das habe ich vor zu tun und habe mir das Tool gerade runtergeladen.> Was ich aber noch nicht so ganz verstehe:>> Angenommen ein (eindeutiges) USB gerät meldet sich erstmalig beim> Treiber an und bekommt "COM6" zugewiesen.>> 1)> Was würde passieren, wenn ich nun re-boote?> Bleibt das sicher auf "COM6" oder erfolgt die Zuweisung neu? Wenn du> sagst "Registry" würde ich tippen, dass es fix hinterlegt ist...
In der Regel bleibt er da.
> 2)> Angenommen ich stecke das Gerät mit "COM6" ab. Kann es dann sein, dass> der nunmehr freie Port für ein neues Gerät verwendet wird (z.B. wenn ich> etwas anderes zwischendurch anstecke)? Wenn ich dann das ursprüngliche> Gerät wieder anstecke, wäre der "COM6" ja bereits vergeben. Oder merkt> sich das Betriebssystem, dass COM6 belegt ist, und versucht erst gar> nicht, den freien Port zu vergeben, auch wenn er gerade nicht aktiv ist?
In der Regel merkt sich Windows den belegten Port.
Und genau weil das alles nur in der Regel ist, würde ich unbedingt
eindeutige Seriennummern vergeben und bei jedem Programmstart die COM
Ports den Seriennummern neu zuordnen.
Noch besser wäre allerdings gleich über das direkte API zu gehen, bei
FTDI wäre das die d2xx DLL, bei Silabs gibts das auch, Name ist mir eben
entfallen. Da kannst du dir den ganzen Quatsch mit COM sparen und sogar
in den Chip Optionen hinterlegen, dass erst gar kein virtueller COM Port
erzeugt werden soll.
Peter D. schrieb:> Windows merkt sich für jeden USB-Anschluß den COM-Port.> Also einfach an den ersten Port stecken, im Gerätemanager COM1 zuweisen,> an den 2. stecken, COM2 zuweisen usw.> Wenn Du Umsetzer ohne eigene Seriennummer (z.B. Prolific) hast, wars das> schon.> Ansonsten mußt Du das Spielchen für alle Umsetzer wiederholen. Du kannst> sie aber auch nur an den vorgesehenen Anschluß stecken und zuweisen, nur> darfst Du sie dann nicht mehr vertauschen.>> Warnungen, daß eine COM bereits belegt sei, kannst Du ignorieren,> solange Du nicht 2 USB-Ports die gleiche COM verpaßt. Es sollten nie 2> gleiche COMs gleichzeitig angesteckt sein.
was meinst du da bei "Also einfach an den ersten Port stecken" mit
Port? Einfach den USB-Stecker am PC oder an einem Hub?
heißt das jetzt,
1) wenn keine Seriennummer:
Ich registriere mit einem beliebigen Umsetzer jeden USB-Steckplatz mit
einem anderen COM Port? Windows merkt sich dann, dass der Umsetzer am
einen bestimmten Steckplatz uner "COM1" und am anderen unter "COM2"
erreichbar ist. Da alle Umsetzter gleich sind (keine Seriennummer),
funktioniert das mit beliebigen Umsetzern.
Ich habe das nun ausprobiert, und es funktioniert an meinem Notebook mit
zwei USB Steckern.
2) wenn die Umsetzter alle verschiedene Seriennummern haben, dann kann
ich jedem einzelnen Umsetzer pro USB Steckplatz einen seriellen COM Port
zuweisen?
Diese Einstellungen merkt sich Windows.
So hätte ich es verstanden.
c-hater schrieb aber, ich hätte es nicht verstanden:
>> Sobald ich ein USB Gerät an einen Port eines Hubs anschließe, merkt sich>> Windows den hierbei generierten COM-Port ? Habe ich das richtig>> verstanden?>Nein.
Du meinst aber:
> Windows merkt sich für jeden USB-Anschluß den COM-Port.
Hier ist ein widerspruch. Sorry, ich verstehe es immer noch nicht...
Christian R. schrieb:> Und genau weil das alles nur in der Regel ist, würde ich unbedingt> eindeutige Seriennummern vergeben und bei jedem Programmstart die COM> Ports den Seriennummern neu zuordnen.
und wie geht das? Ich nehme an das steht irgendwo in der Registry. Aber
wo?
Über WMI kann man die benötigten Daten je nach Adapter gut auslesen.
Im Screenshot im Anhang: Beim FT232R sind die Daten über Win32_PnPEntity
zu finden.
"Caption" enthält den COM-Port und die Device-ID enthält die
Seriennummer (hier "A9TEOIZVA")
Leider nicht auch direkt als einzelne Felder und man muss etwas
parsen/filtern. Bei vielen Adaptern liefert auch Win3_SerialPort was.
WMI Code Creator:
https://www.microsoft.com/en-us/download/details.aspx?id=8572
In seiner "unnachahmlichen" Art hat das "c-hater" schon beschrieben.
Es gibt zwei gleichzeitig verwendete Verfahren, wie eine
USB-Seriell-Bridge zu ihrem COM-Port kommt. Der Dreh- und Angelpunkt ist
das Vorhandensein einer eineindeutigen Seriennummer der
USB-Seriell-Bridge und der diese Seriennummer auswertende Devicetreiber
(wie es beispielsweise bei den Treibern von FTDI der Fall ist).
Gibt es eine Seriennummer, ist der COM-Port mit der Seriennummer
verknüpft. Egal, wo im USB-Device-Baum die USB-Seriell-Bridge
angeschlossen wird, sie wird immer mit der gleichen COM-Port-Nummer
verheiratet.
Gibt es keine Seriennummer, ist der COM-Port mit der Position der
USB-Seriell-Bridge im USB-Device-Baum verknüpft.
Der USB-Device-Baum stellt den logischen Aufbau der Kombination von
USB-Controllern, USB-Hubs und USB-Geräten dar.
Das Tool hier http://www.uwe-sieber.de/usbtreeview.html zeigt den
USB-Device-Baum übersichtlich und mit allen relevanten Details auch zu
einzelnen USB-Geräten an.
Komm Peiler schrieb:> c-hater schrieb:>> Es ist dabei vollkommen scheißegal, ob der Port direkt am Rechner ist>> oder an irgendeinem verschissenen Hub.>> Scheißkerl?
Wahrscheinlich Tourette-Syndrom, Betroffene müssen zwanghaft in den
normalen Redefluss immer wieder Schimpfwörter und Fäkalausdrücke
einstreuen und haben darüber keinerlei Kontrolle. Bei c-hater ist das
schon extrem ausgeprägt. Das sind höchst bedauernswerte kranke Menschen.
Georg
georg schrieb:> Das sind höchst bedauernswerte kranke Menschen.
Mag sein. Aber ich weiß wenigstens BEZÜGLICH DER SACHE, wovon ich rede.
Wer also was lernen will, sollte schlicht meine nicht-Wattebällchen
-Srache ignorieren und sich auf die Fakten zu konzentrieren.
Das scheint den Leuten umso schwerer zu fallen, je unwissender sie sind
und je weniger sie deshalb zur Sache beizutragen haben. Nicht meine
Schuld...
Man braucht sich doch bloß deine armselige Gestalt anzuschauen. Nicht
einen Fakt im Thread geäußert, aber auf dem Nebenschauplatz der "Form"
die Riesenfresse aufreißen...
Echt armselig...
Dann lieber krank, aber wissend...
Rufus Τ. F. schrieb:> Es gibt zwei gleichzeitig verwendete Verfahren, wie eine> USB-Seriell-Bridge zu ihrem COM-Port kommt.
ich glaube jetzt hab ich es das erste mal vestanden. danke !
Rufus Τ. F. schrieb:> Gibt es keine Seriennummer, ist der COM-Port mit der Position der> USB-Seriell-Bridge im USB-Device-Baum verknüpft.>> Der USB-Device-Baum stellt den logischen Aufbau der Kombination von> USB-Controllern, USB-Hubs und USB-Geräten dar.
wieso zeigt das Tool aber die Seriennummer nicht an?
Es wird auch die VendorId und die PoductId nicht angezeigt. Ich
dachte diese beiden Ids machen neben der Seriennummer den Schlüssel für
die Anmeldung eines Gerätes aus--
ahh: es ist unter deviceId zusammengefasst.
Device ID : USB\VID_10C4&PID_EA60\5&13290149&0&2
Meine Seriennummer sollte aber 1 sein.
Danke !
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang