2016-10-04 56 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を使用しているので、私はシリアル番号を確実に取得するので、ちょっと変わっています。多分私はVM上にいるので? – LavaCharizard

+0

あなたはusbデバイスがより大きなタイムアウトまたは時には複数回の転送を送信するかどうか調査しましたか?より高いレベルのUSBデバイスツールとは対照的に、libusbは低レベルを扱っています。もちろん、VMの場合は**これにより反応時間が長くなる可能性があります。しかし、プロパティを読み込むだけでなく、USBデバイスと通信するようになった場合は、あとで起こったさまざまなエラーをすぐに察知することができます。フォールトトレランスが鍵です。それがコンピュータの仕組みです。 ;) – dryman

+0

あなたの疑問がある場合は、usb-snifferを使ってusb-devicesとツールを比較してください。それは簡単です。 – dryman

0

私のデバイスは奇妙な状態になっていて、正しく閉じられていない可能性があります。とにかく、libusb_open()コールの直後にlibusb_reset_device(hHandle);を呼び出すと、私の散発的なタイムアウトの問題が修正されたようです。

libusb_reset_device()

関連する問題