USB g_serialエラー? - 一方向のデータ損失

USB g_serialエラー? - 一方向のデータ損失

カーネルモジュールGadget Serial v2.4を使用するにはいくつかの困難があります。 g_serial は、Arch Linux 4.6.3-1 がインストールされている ARM マシン BeagleBone Black でホスト PC と通信するために使用されます。

問題は次のホストで再現されます。

  • Linux 4.2.0-23、PC x86_64、
  • Linux 3.4.43、Cubieboard2 armv7l、
  • Windows 10、PC x86_64、

他のソフトウェアを使用してください。

  • デバイス(ビーグルボーンブラック):

    • C++ と用語、
    • python3-pyserial.
  • ホスト(PCまたはCubieboard2):

    • C#+ .NET、
    • python3-pyserial.

Pythonテスト:https://github.com/tomasxvavra/serial_test

問題は、デバイス→ホストの方向からデータが失われることです。たとえば、デバイスがttyGS0に100 MBのデータを送信すると、ホストはttyACM0からデータの99.7%しか受信しません。これいいえホスト - >デバイスの方向に発生します。

失われたデータの量は、次の条件によって異なります。

  • シリアルポートに書き込まれたデータ「パケット」サイズ: * s.write(data)を介してポートに一度に100 MBを書き込むと、失敗する可能性がはるかに少なくなります。パケットサイズが異なるポートに書き込むと、エラーレートが異なります。たとえば、
    • 小さいパケット<= 512B - 大丈夫ですが、時には約10-512Bが失われて失敗します。
    • より大きなパケット 4096 - 32768 B: より頻繁に失敗し、多くのデータが失われます。
  • ホストデバイス速度- 遅いCubieboard2の故障率はPCよりはるかに高く、特にパケットが大きい場合はさらにそうです。

1024 B または同等のサイズの数字を送信すると失敗することがあり、通常は 512 B が失われます。また、Wiresharkを使用してUSBパケットを分析してみましたが、実際にパケット損失が発生しました。しかし、それ以外は異常とは説明できません。

だからこれは私のカーネルの観点から見たタイミングの問題のようです。 g_serialも同様の経験を持っていますか?ありがとうございます。

編集する

ホストがCubieboard2(CPU 2個)のときにCPU 1個をロードすると、エラー率が急速に低下することがわかりました。

cat /dev/zero > /dev/null

ただし、ロードサイズが異なると、状況が悪化する可能性があります。それでもタイミングの問題があるようです。 //

関連情報