Comment puis-je recevoir des rapports HID en utilisant libusb-1.0?
-
27-10-2019 - |
Question
J'ai une échelle HID USB que je dois aller chercher les rapports de pesée de. Je suis en mesure de le faire sur Linux en lisant 7 octets à la fois de /dev/hidraw#
, mais je voudrais obtenir les mêmes informations en utilisant libusb-1.0.
Même quand je reçois des octets non nuls, j'obtiens l'erreur -9: LIBUSB_ERROR_PIPE
Je tente d'utiliser un transfert de contrôle comme ceci:
#define WEIGH_REPORT_SIZE 7
/*
* Open a handle to the found scale
*/
libusb_open(dev, &handle);
#ifdef __linux__
libusb_detach_kernel_driver(handle, 0);
#endif
libusb_claim_interface(handle, 0);
/*
* Try to transfer data about status
*
*/
unsigned char data[WEIGH_REPORT_SIZE];
unsigned int len = libusb_control_transfer(
handle,
LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS |
LIBUSB_RECIPIENT_INTERFACE,
HID_REPORT_GET,
//wValue => hid report, no report ID
0x0100,
0x00, //windex => interface 0
data,
WEIGH_REPORT_SIZE, //wLength
10000 //timeout => 10 sec
);
int i;
printf("Got %d bytes from control transfer:\n", len);
for(i = 0; i < WEIGH_REPORT_SIZE; i++) {
printf("%x\n", data[i]);
}
La solution
Un exemple à lire à partir d'un lecteur de carte USB HID en utilisant libusb-gagnant -
http: // rowsandcolumns. blogspot.com/2011/02/read-from-magtek-card-swipe-reader-in.html
Autres conseils
HID utilise le transfert Interrompre AFAIK. Vous devez réécrire votre code pour utiliser ces derniers. Et un coup d'oeil à thouse descripteurs -. Ils vous dire quelle interface utiliser
Cela dit, je pense qu'il est beaucoup plus facile à utiliser / dev / hdiraw ??# puis libusb dans ce cas.
Essayez d'utiliser une autre valeur pour wValue
(0x0300
, par exemple).
Vérifiez également les paramètres de bmRequestType
et bRequest
:. bmRequestType
doit être égale à 0xA1
, bRequest
- 0x01