2016-10-04 583 views
0

我想使用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); 
} 

回答

0

我看不出你的代码有什么问题。在USB环境下,我不太在乎超时。这是一辆公共汽车,可以被不同的交通占据。

正如您可能知道的那样,取决于USB的版本,控制传输预留了一部分带宽。 libusb_get_string_descriptor_ascii只是发送所有需要的控制传输来获取字符串。如果有任何超时它会中止。你可以尝试发送这个控制传输你自己,并使用更大的超时值,但我想超时的可能性将永远在那里等待你(双关意图)。

+0

好的,谢谢你的回答!我想我必须调查更多关于为什么我要用libusb获取超时。我发现它有点奇怪,因为当我使用命令usb-devices https://linux.die.net/man/1/usb-devices时,我可靠地获取序列号。也许是因为我在虚拟机上? – LavaCharizard

+0

你有没有调查usb设备是否发送更大的timouts传输或有时多次?借助libusb,您可以处理较低级别的高级别usb设备工具。当然,如果它是虚拟机,这可能会导致更长的响应时间。但是如果你开始不仅读取属性而且与USB设备进行通信,那么你将很快遇到不同的错误,即使一切都很好,也会发生这种错误。容错是关键。这就是电脑的工作原理。 ;) – dryman

+0

但是,如果你怀疑只是使用USB嗅探器,并将你的工具与USB设备进行比较。就是这么简单。 – dryman

0

因此,事实证明我的设备进入了奇怪的状态,可能没有正确关闭或类似的东西。无论如何,在libusb_open()调用之后调用libusb_reset_device(hHandle);似乎解决了我零星的超时问题。

libusb_reset_device()