Hallo,
ich entwickle USB Gerät für Temperaturlogging.
Am PC läuft eine Software, welche die ADC Werte vom Gerät bekommt,
Datenauswertung macht und die Temperatur darstellt.
Dabei setze ich generischen Treiber Win32-LibUsb ein.
In der Software spreche das Gerät über VID und PID an. D.h. der Bus wird
nach meinen VID und PID gescannt und gibt mir einen Handle auf das Gerät
zurück.
Mein Problem ist:
Wenn zwei Geräte gleichzeitig am PC angeschlossen sind, wie kann ich die
dann unterscheiden? Denn beide haben gleiche VID und PID.
Vieleicht kann mir jemand paar Tipps geben, diese SChwierigkeit schnell
zu lösen :)
Du brauchst noch eine eindeutige Gerätekennung.
Die VID gibt den Hersteller an und die PID das Produkt des Herstellers.
Jetzt muss man noch das Produkt eindeutig kennzeichnen, so dass VID /
PID / eine eindeutige Kombination ergeben.
UINT USB_VID = 0x1234;
UINT USB_PID = 0x1234;
BYTE USB_SerialStr[] = {0x0A,0x03,'1',0,'1',0,'1',0,'8',0}; /**<
Eindeutige USB-Device Nummer <br>*/
SF wrote:
> Wenn zwei Geräte gleichzeitig am PC angeschlossen sind, wie kann ich die> dann unterscheiden? Denn beide haben gleiche VID und PID.
Per Seriennummer. (Weiß nicht, ob dir das aus Ingenius' Antwort
wirklich klar geworden war.)
Hallo,
danke für die Antowort.
Hab jetzt nach SEriennummer mein Gerät und die Software duchgeschaut.
Stimmt. Ich muss die Seriennummer verwenden. Diese muss für jedes Gerät
eindeutig sein. Man sieht sie, wenn man Eigenschaften des Gerätes unter
GErätmanager anschaut.
Z.B.:
USB\VID_1A40&PID_0101\5&23D3BB0F&0&4
Seriennummer: 5&23D3BB0F&0&4
In der PC-software kann ich auch über dev->descriptor.iSerialNumber auf
die Seriennummer zugreifen.
Muss nur noch heruasfinden welchen Datentyp ich verwenden darf.
Aber das ist Compiler und Entwicklungsumgebung Sache...
Das Prinzip mit USB ist soweit klar! Danke vielmals
SF wrote:
> Muss nur noch heruasfinden welchen Datentyp ich verwenden darf.
An sich ist die Seriennummer bei USB ein x-beliebiger Text.
Allerdings schreiben wohl manche Geräteklassen ein bestimmtes
Format vor (habe sowas von mass storage devices gehört). Sofern
ich mich recht entsinne, ist das typischerweise ein hexadezimaler
String dann.
SF wrote:
> Z.B.:> USB\VID_1A40&PID_0101\5&23D3BB0F&0&4>> Seriennummer: 5&23D3BB0F&0&4
Das ist dann die von Windows "zufällig" gewählte, wenn kein SerialNumber
String eingetragen ist.
> In der PC-software kann ich auch über dev->descriptor.iSerialNumber auf> die Seriennummer zugreifen.
Nicht direkt. iSerialNumber ist nur die Nummer des StringDescriptors,
der die SerialNumber enthält.
Der StringDescriptor selbst muss genauso definiert werden wie der für
Hersteller und Gerätekennung.
> Muss nur noch heruasfinden welchen Datentyp ich verwenden darf.> Aber das ist Compiler und Entwicklungsumgebung Sache...
Ein String. Und da bLength im StringDescriptor ein 8-Bit Typ ist, darf
die Länge maximal 255 Zeichen sein.
>Nicht direkt. iSerialNumber ist nur die Nummer des StringDescriptors,>der die SerialNumber enthält.
Das stimmt. Hab es grad eben ausprobiert. Ich bekomme nur die Nummer des
String deskriptors. Wie kann ich aber auf den Inhalt dieses Deskriptors
zugreifen?
Mein Ziel ist es gesamten String auslesen und den dann vergleichen.
> Muss nur noch heruasfinden welchen Datentyp ich verwenden darf.> Aber das ist Compiler und Entwicklungsumgebung Sache...
Soweit ich weiss, ist die Seriennummer ein String.
Du darfst für die Seriennummer die darstellbaren Zeichen (0x20 - 0x7F)
verwenden, mit Ausnahme des Codes 0x2C -> Komma.
Du darfst die Seriennummer auch weglassen, Windows unterscheidet in
diesem Fall die Geräte anhand des Ports, an dem die Geräte eingesteckt
sind. Jeder USB-Anschluss hat eine sogenannte LocationID, die man dann
verwenden kann.
Einige USB-Geräteklassen setzen eine Seriennummer voraus.
Ralf
SF wrote:
>>Nicht direkt. iSerialNumber ist nur die Nummer des StringDescriptors,>>der die SerialNumber enthält.>> Das stimmt. Hab es grad eben ausprobiert. Ich bekomme nur die Nummer des> String deskriptors. Wie kann ich aber auf den Inhalt dieses Deskriptors> zugreifen?
aus der Header-Datei von der LibUSB:
Hallo,
das Thema würde mich auch sehr interessieren, da ich auch einen USB
Gerät entwickelt habe, mit der ich Relais schalten kann.
Frage ist, wie oder wo lässt sich es einstellen, wenn ich mit der PC
Software zwei gleiche USB Geräte ansteuern möchte?
VID / PID und die BUS Serial Nummer sind alle identisch.
Wie verwaltet Windows das ganz?
Was muss ich an Windows-System ändern, damit ich beide Geräte
gleichzeitig ansprechen kann?
danke im Voraus
Peter
Peter schrieb:> das Thema würde mich auch sehr interessieren
Offenbar nicht so sehr, dass du dir den Thread auch durchgelesen
hättest,
bevor du ihn nach acht(!) Jahren wieder ausbuddelst.