繁体   English   中英

libusb_get_string_descriptor_ascii()超时错误?

[英]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()调用似乎解决了我偶发的超时问题之后。

libusb_reset_device()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM