我想使用libusb-1.0获取USB设备的序列号。libusb_get_string_descriptor_ascii()超时错误?
我遇到的问题是,有时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);
}
好的,谢谢你的回答!我想我必须调查更多关于为什么我要用libusb获取超时。我发现它有点奇怪,因为当我使用命令usb-devices https://linux.die.net/man/1/usb-devices时,我可靠地获取序列号。也许是因为我在虚拟机上? – LavaCharizard
你有没有调查usb设备是否发送更大的timouts传输或有时多次?借助libusb,您可以处理较低级别的高级别usb设备工具。当然,如果它是虚拟机,这可能会导致更长的响应时间。但是如果你开始不仅读取属性而且与USB设备进行通信,那么你将很快遇到不同的错误,即使一切都很好,也会发生这种错误。容错是关键。这就是电脑的工作原理。 ;) – dryman
但是,如果你怀疑只是使用USB嗅探器,并将你的工具与USB设备进行比较。就是这么简单。 – dryman