[英]libusb_get_string_descriptor_ascii() timeout error?
我正在尝试使用libusb-1.0获取USB设备的序列号。
我遇到的问题是,有时libusb_get_string_descriptor_ascii()函数在我的代码中返回-7(LIBUSB_ERROR_TIMEOUT),但其他时候序列号已正确写入我的数组中,而我无法弄清楚发生了什么。 我使用libusb的方式有误吗? 谢谢。
void EnumerateUsbDevices(uint16_t uVendorId, uint16_t uProductId) {
libusb_context *pContext;
libusb_device **ppDeviceList;
libusb_device_descriptor oDeviceDescriptor;
libusb_device_handle *hHandle;
int iReturnValue = libusb_init(&pContext);
if (iReturnValue != LIBUSB_SUCCESS) {
return;
}
libusb_set_debug(pContext, 3);
ssize_t nbUsbDevices = libusb_get_device_list(pContext, &ppDeviceList);
for (ssize_t i = 0; i < nbUsbDevices; ++i) {
libusb_device *pDevice = ppDeviceList[i];
iReturnValue = libusb_get_device_descriptor(pDevice, &oDeviceDescriptor);
if (iReturnValue != LIBUSB_SUCCESS) {
continue;
}
if (oDeviceDescriptor.idVendor == uVendorId && oDeviceDescriptor.idProduct == uProductId) {
iReturnValue = libusb_open(pDevice, &hHandle);
if (iReturnValue != LIBUSB_SUCCESS) {
continue;
}
unsigned char uSerialNumber[255] = {};
int iSerialNumberSize = libusb_get_string_descriptor_ascii(hHandle, oDeviceDescriptor.iSerialNumber, uSerialNumber, sizeof(uSerialNumber));
std::cout << iSerialNumberSize << std::endl; // Print size of serial number <--
libusb_close(hHandle);
}
}
libusb_free_device_list(ppDeviceList, 1);
libusb_exit(pContext);
}
我认为您的代码没有错。 我不太关心USB上下文中的超时。 毕竟,这是一辆公共汽车,可以占用不同的流量。
如您所知,根据USB版本的不同,有一部分带宽保留用于控制传输。 libusb_get_string_descriptor_ascii
只需发送所有必需的控件传输即可获取字符串。 如果其中任何一个超时,它将终止。 您可以尝试自己发送此控件,并使用更大的超时值,但是我想总是有超时的可能性来等待您(双关语意)。
因此,事实证明我的设备进入了奇怪的状态,可能无法正确关闭等。 无论如何,调用libusb_reset_device(hHandle);
就在libusb_open()
调用似乎解决了我偶发的超时问题之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.