現在、USB デバイスを使用するコードを Windows から Linux に移植しています。
元のアプリケーションを徹底的にテストしましたが、デバイスが正常に動作することを確信しています。hidapi-libusb を使用して Linux に USB インターフェイスを実装しましたが、デバイスから返されたデータが少なくとも 1 バイト欠落している場合があります。
それが発生すると、返されるすべての値にそれだけのデータが欠落します。USBデバイスにデータを正しく読み取らせるために、多かれ少なかれUSBデバイスを切断して再接続する必要があります。最初のバイトが 00 として返されることがあり、Linux がそれを無視するのではないかと考え始めています。通常、連続した読み取りで発生します。
例: get register state を送信し、USB 読み取りに使用できるデータが 10 個あることを期待しています。バイト 5 はデータの番号です。
期待される:
00 00 01 02 00 08 42 (データ 8)
00 00 01 02 00 09 42 (データ9)
実際:
00 00 01 02 00 08 42 (データ 8)
00 00 02 00 09 42 ab (データ 9)
データ 9 のパケット番号が 1 バイト欠落しているため、間違っています。hidapi-hidraw に変更してみましたが、発生する頻度が大幅に減りました。デバイス (/dev/hidraw0) の hidraw の 16 進ダンプを確認しましたが、アプリケーションで取得しているデータと一致しています。メモリ リーク検出ツールを使用してみましたが、リークや破損は検出されませんでした。
これは Linux の問題 (3.2.0-4-amd64) ですか、それともデバイスの問題ですか?
私のアプリケーションの擬似コードは次のとおりです。
HIDAPI およびデバイス関連の初期化
HIDAPI を使用してデバイスに接続する
USB コマンドの書き込み
USB コマンドの読み取り (書き込みで複数のデータが必要な場合は複数回実行)
データを解析する
すべてのコマンドが実行されるまで、3 と 4 を繰り返します。
メモリを解放し、HIDAPI を閉じます。
私が試したこと:
読み取りと書き込みの間に遅延がないことを確認する
書き込み前に読み取りデータのフラッシュを追加します (場合によっては漂遊データをキャッチします)。
読み取りデータのフラッシュに非常に長いタイムアウト (5 秒) を追加すると、大きなコストで問題が大幅に軽減されます。