Ich möchte mit C++ eine Linux Applikation schreiben, die über die USB-Schnistelle mit einem Gerät kommuniziert. Der Hersteller liefert natürlich eine CD-ROM mit, auf der ein Windows Treiber und eine API für ein DeveloperKit enthalten ist. Wenn ich das USB-Gerät unter Linux anschließe wird es als HID erkannt. Da ich bisher keine Ahnung und keine Erfahrung von USB-Programmierung hatte habe ich angefangen mich schlau zu machen. Bisher sieht es so aus:
Mir ist es gelungen mit Hilfe der HIDAPI hex-Werte zu empfangen und zu interpretieren. Was genau feature requests und feature reports sind weiß ich nicht, aber wenn ich die hid_read() aufrufe dann bekomme ich eine Antwort die mit 0x01 0x80 beginnt und danach die von mir gewünschten Werte. Wie ich herausfinden konnte wird dazu die GeräteDatei /dev/hidraw3 angesprochen, die man auch einfach mit einem cat /dev/hidraw3 auslesen kann.
Das wäre auch alles wunderbar, wenn das nicht so langsam ginge! Bei einer Abfragefrequenz von 60Hz habe ich noch eine Read-Error-Rate von unter 1%. Aber schon bei den von mir gewünschten 200Hz geht die Read-Error-Rate auf über 50%.. Unter Windows erreiche ich mit der API des Herstellers hingegen 1000Hz. Das alles erreiche mit einem einfachen usleep(15*1000) am Ende einer while-Schleife.
Neben den HIDRAW (was ja für RAW steht) gibt es aber scheinbar auch noch USBHID. Was genau der Unterschied sein soll ist mir nicht klar. Aber wenn ich das Gerät einstecke entsteht unterhalb von /dev/input/ noch zusätzlich ein neues event, nämlich das event15. Was sind denn diese events? Ich habe Beispielcode gefunden um die events auszulesen, aber auch damit schaffe ich nur 120Hz. Es werden Werte geliefer, aber es sind nicht die selben wie mit hidapi und die Interpretation der Werte ist mir auch noch nicht gelungen.
Dann habe ich noch einen Beispielcode gefunden wo jemand mit libusb auf ein HID-Gerät zugreift. Das funktioniert scheinbar ganz anderst, und ich bekomme diesen Code auch nicht zum Laufen: Usb error: error submitting urb: no such file or directory.
Dann hab ich noch rausgefunden dass lsusb -vvv eine ganze Menge Informationen liefert. Kann man da etwas für die feature reports erfahren?
USB HID Device
USB HID Device
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?
Re: USB HID Device
Infos zu USB HID findest du hier:
https://en.wikipedia.org/wiki/USB_human ... ss#Reports
http://www.osronline.com/ddkx/intinput/ ... s_5dev.htm
http://www.usb.org/developers/devclass_docs/HID1_11.pdf
Kurzzusammenfassung: USB HID Geräte kommunizieren über sogenannte Reports. Davon gibt es drei Typen: Input, Output, Feature. Dabei ist Feature üblicherweise zum umkonfigurieren gedacht. Jeder Report ist ein kurzes Datenpaket, das erste Byte ist die Länge in Bytes. Damit jetzt der PC weiß, welche Reports das Gerät unterstützt, gibt es einen Report Descriptor, in dem das alles beschrieben ist. Details dazu siehe HID1_11.pdf.
Unterschied zwischen hiddev und hidraw siehe hier: http://lxr.linux.no/#linux+v3.4.1/Docum ... hidraw.txt
An den Report Descriptor kommst du unter Linux am einfachsten ran, indem du das debugfs mountest, zb. mit. Die Report-Descriptors für alle angeschlossenen HID-Devices tauchen dann dort auf. (Siehe auch http://www.spinics.net/lists/linux-input/msg03679.html)
https://en.wikipedia.org/wiki/USB_human ... ss#Reports
http://www.osronline.com/ddkx/intinput/ ... s_5dev.htm
http://www.usb.org/developers/devclass_docs/HID1_11.pdf
Kurzzusammenfassung: USB HID Geräte kommunizieren über sogenannte Reports. Davon gibt es drei Typen: Input, Output, Feature. Dabei ist Feature üblicherweise zum umkonfigurieren gedacht. Jeder Report ist ein kurzes Datenpaket, das erste Byte ist die Länge in Bytes. Damit jetzt der PC weiß, welche Reports das Gerät unterstützt, gibt es einen Report Descriptor, in dem das alles beschrieben ist. Details dazu siehe HID1_11.pdf.
Unterschied zwischen hiddev und hidraw siehe hier: http://lxr.linux.no/#linux+v3.4.1/Docum ... hidraw.txt
An den Report Descriptor kommst du unter Linux am einfachsten ran, indem du das debugfs mountest, zb. mit
Code: Alles auswählen
mount none /debug -t debugfs