我想使用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);
}
好的,謝謝你的回答!我想我必須調查更多關於爲什麼我要用libusb獲取超時。我發現它有點奇怪,因爲當我使用命令usb-devices https://linux.die.net/man/1/usb-devices時,我可靠地獲取序列號。也許是因爲我在虛擬機上? – LavaCharizard
你有沒有調查usb設備是否發送更大的timouts傳輸或有時多次?藉助libusb,您可以處理較低級別的高級別usb設備工具。當然,如果它是虛擬機,這可能會導致更長的響應時間。但是如果你開始不僅讀取屬性而且與USB設備進行通信,那麼你將很快遇到不同的錯誤,即使一切都很好,也會發生這種錯誤。容錯是關鍵。這就是電腦的工作原理。 ;) – dryman
但是,如果你懷疑只是使用USB嗅探器,並將你的工具與USB設備進行比較。就是這麼簡單。 – dryman