Я пытаюсь получить серийный номер устройства USB с помощью libusb-1.0.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-устройства передачи с большими сроками или, возможно, иногда несколько раз? С libusb вы имеете дело с низким уровнем, в отличие от инструмента USB-устройств более высокого уровня. Конечно, если это VM, это ** может ** привести к увеличению времени реакции. Но если вы начнете не только читать свойства, но и обмениваться данными с USB-устройством, вы скорее всего столкнетесь с различными ошибками, которые просто происходят, даже если все отлично. Отказоустойчивость - это ключ. Так работают компьютеры. ;) – dryman
Но если у вас есть сомнения, просто используйте usff-сниффер и сравните свой инструмент с USB-устройствами. Это так просто. – dryman