2016-10-04 261 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()