我试图使用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);
}
答案 0 :(得分:0)
我发现您的代码没有任何问题。我不太关心USB背景下的超时。毕竟这是一辆公共汽车,可以占用不同的交通。
您可能知道USB的版本取决于控制传输的一部分带宽。 www
只是发送所有必需的控件传输来获取字符串。如果其中任何一次超时,它将中止。您可以尝试自己发送此控件传输并使用更大的超时值,但我想超时的可能性总是在那里等待你(双关语)。
答案 1 :(得分:0)
事实证明我的设备进入了奇怪的状态,可能没有正确关闭等等。无论如何,在libusb_reset_device(hHandle);
调用之后调用libusb_open()
似乎可以修复我的零星超时问题。