2016-10-04 4 views
0

Я пытаюсь получить серийный номер устройства 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); 
} 

ответ

0

Я не вижу ничего плохого в вашем коде. Я не хотел бы много говорить о тайм-аутах в контексте USB. Это автобус в конце концов и может быть занят разными трафиками.

Как вы, возможно, знаете, в зависимости от версии USB есть часть полосы пропускания, зарезервированная для передачи управления. libusb_get_string_descriptor_ascii просто отправляет все необходимые передачи управления для получения строки. Если какой-либо из этих сроков будет отменен. Вы можете попытаться отправить этот контроль самостоятельно и использовать большие значения таймаута, но я предполагаю, что время ожидания всегда будет ждать вас (каламбур).

+0

Хорошо, спасибо за Ваш ответ! Наверное, мне нужно больше исследовать, почему я получаю таймауты с libusb. Мне кажется, что это немного странно, когда я использую команду usb-devices https://linux.die.net/man/1/usb-devices, я уверенно получаю серийный номер. Может быть, потому что я на ВМ? – LavaCharizard

+0

Вы исследовали, отправляют ли usb-устройства передачи с большими сроками или, возможно, иногда несколько раз? С libusb вы имеете дело с низким уровнем, в отличие от инструмента USB-устройств более высокого уровня. Конечно, если это VM, это ** может ** привести к увеличению времени реакции. Но если вы начнете не только читать свойства, но и обмениваться данными с USB-устройством, вы скорее всего столкнетесь с различными ошибками, которые просто происходят, даже если все отлично. Отказоустойчивость - это ключ. Так работают компьютеры. ;) – dryman

+0

Но если у вас есть сомнения, просто используйте usff-сниффер и сравните свой инструмент с USB-устройствами. Это так просто. – dryman

0

Таким образом, мое устройство попадает в странные состояния, возможно, не закрывается должным образом или тому подобное. Во всяком случае, вызывая libusb_reset_device(hHandle); сразу после звонка libusb_open(), кажется, исправить мою спорадическую проблему с таймаутом.

libusb_reset_device()