如何使用libusb-1.0接收HID报告?

时间:2011-01-30 18:33:26

标签: c usb hid libusb libusb-1.0

我有一个USB HID刻度,我需要从中获取称重报告。我可以通过从/dev/hidraw#一次读取7个字节来在Linux上执行此操作,但我希望使用libusb-1.0获取相同的信息。

即使我得到一些非空字节,我也会收到错误-9:LIBUSB_ERROR_PIPE

我试图像这样使用控件传输:

#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]);
    }

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

HID使用中断传输AFAIK。您需要重写代码才能使用它们。并查看thouse描述符 - 它们告诉您使用哪个接口。

那说我觉得在这个案例中使用/ dev / hdiraw​​#然后libusb要容易得多。

答案 2 :(得分:1)

尝试使用wValue的另一个值(例如0x0300)。

同时检查bmRequestTypebRequest参数:bmRequestType必须等于0xA1bRequest - 0x01