2

現在、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) ですか、それともデバイスの問題ですか?

私のアプリケーションの擬似コードは次のとおりです。

  1. HIDAPI およびデバイス関連の初期化

  2. HIDAPI を使用してデバイスに接続する

  3. USB コマンドの書き込み

  4. USB コマンドの読み取り (書き込みで複数のデータが必要な場合は複数回実行)

  5. データを解析する

  6. すべてのコマンドが実行されるまで、3 と 4 を繰り返します。

  7. メモリを解放し、HIDAPI を閉じます。

私が試したこと:

  1. 読み取りと書き込みの間に遅延がないことを確認する

  2. 書き込み前に読み取りデータのフラッシュを追加します (場合によっては漂遊データをキャッチします)。

  3. 読み取りデータのフラッシュに非常に長いタイムアウト (5 秒) を追加すると、大きなコストで問題が大幅に軽減されます。

4

0 に答える 0