libusb_get_string_descriptor_ascii()超时错误?

时间:2016-10-04 15:55:45

标签: c++ ubuntu-16.04 libusb libusb-1.0

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

2 个答案:

答案 0 :(得分:0)

我发现您的代码没有任何问题。我不太关心USB背景下的超时。毕竟这是一辆公共汽车,可以占用不同的交通。

您可能知道USB的版本取决于控制传输的一部分带宽。 www只是发送所有必需的控件传输来获取字符串。如果其中任何一次超时,它将中止。您可以尝试自己发送此控件传输并使用更大的超时值,但我想超时的可能性总是在那里等待你(双关语)。

答案 1 :(得分:0)

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

libusb_reset_device()