我想使用 libusb 库与 HID 设备通信。我可以实现它的很多功能,这还可以。但是当我想使用
libusb_get_device_descriptor()
函数和 libusb_get_descriptor()
函数获取设备描述符时,它会显示某些字段的不同值,例如 Control Max Packet Size。
我对两个函数进行了如下编码:
#include <stdio.h>
#include "libusb.h"
int main(void)
{
libusb_device_handle* dev_handle;
int init = libusb_init(NULL);
dev_handle = libusb_open_device_with_vid_pid(NULL, 0x04d8, 0x01ff);
libusb_claim_interface(dev_handle, 0);
unsigned char buf[18];
//first function
libusb_get_descriptor(dev_handle, LIBUSB_DT_DEVICE, 0, buf, sizeof(buf));
for (int i = 0; i < sizeof(buf); i++)
{
printf("%d ", buf[i]);
}
// output
//18 1 0 2 0 0 0 64 216 4 255 1 0 1 1 2 0 1
printf("\n");
//second function
struct libusb_device_descriptor desc;
libusb_get_device_descriptor(libusb_get_device(dev_handle), &desc);
printf("%d ", desc.bMaxPacketSize0);
libusb_release_interface(dev_handle, 0);
libusb_close(dev_handle);
libusb_exit(NULL);
return 0;
}
如果运行上面的代码,第一个函数的 CTRL_Max_Packet_Size 返回值等于 64,但第二个函数的返回值是 8,显然第二个函数是正确的。但是为什么第一个函数返回错误的值? 我已经检查了第一个函数的其他描述符,例如
CONFIG_DESCRIPTOR
,在这种情况下,某些字段也存在一些不正确的值。
我使用的是 Windows 10 64 位,我已经使用 Visual Studio 和 mingw64 编译了我的代码。两者都返回相同的错误值。
我找到了解决方案。问题出在win10中默认安装的驱动程序hidUsb。我使用 Zadig 软件将驱动程序更改为 WinUsb,现在一切正常。