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を使用しているので、私はシリアル番号を確実に取得するので、ちょっと変わっています。多分私はVM上にいるので? – LavaCharizard
あなたはusbデバイスがより大きなタイムアウトまたは時には複数回の転送を送信するかどうか調査しましたか?より高いレベルのUSBデバイスツールとは対照的に、libusbは低レベルを扱っています。もちろん、VMの場合は**これにより反応時間が長くなる可能性があります。しかし、プロパティを読み込むだけでなく、USBデバイスと通信するようになった場合は、あとで起こったさまざまなエラーをすぐに察知することができます。フォールトトレランスが鍵です。それがコンピュータの仕組みです。 ;) – dryman
あなたの疑問がある場合は、usb-snifferを使ってusb-devicesとツールを比較してください。それは簡単です。 – dryman