私は現在、シリアルデバイス(主にARMボード)からデータを受信する必要があるシステムを設計しています。これを実現するために、いくつかのUSB-シリアル(FTDI232)アダプターを使用します。セットアップをテストするために単純なループバックプログラム(9600ボー)をコーディングし、ARMボードをフラッシュして、データを失うことなく、送信したすべてのものを正常に受信できました。
ただし、このシステムは最終的に多くのボードと通信する必要があります。そのため、USBハブをUSBポートに接続し、それを使用してさらに多くのボードを接続しました。しかし、数日後、いくつかの問題に気づきました。最初は、いくつかのビットフリップがあるように見えました。その後、ボードからメッセージを受信すると、バイト全体でさえドロップされることが判明しました。これらのアダプターを通常のUSBポート(間にハブなし)に接続すると、問題は解決しました。
これはバッファリングの問題であると想定しました。シリアルコントローラまたはデバイスがデータを送信する速度が速すぎる可能性があります。そのため、シリアル側にRTS/CTSフロー制御をインストールしました。この場合も、シリアルアダプタがPCに直接接続されている場合ではなく、USBハブによってバイトがドロップされました。
USBハブをより高価なものに切り替えましたが、何も変わりませんでした。 PCを交換しましたが、問題は解決しませんでした。さらに、ハブがシリアルアダプタに送信するパケットをドロップせず、シリアルアダプタによって送信されるパケットのみをドロップすることは混乱を招きます。
私がこれをどのように解決できるか、または問題の原因を誰かが知っていますか? USBハブが原因だと考えています。ただし、多くのデバイスを接続する必要があるため、これに依存しています。したがって、独自のシリアル処理ソリューション(専用FPGAまたはPiベース)を作成する前に、ここの誰かが何が起きているかを知っているかどうかを尋ねたいと思いました。 (ポーリングの問題である場合)より高速なポーリングを可能にするLinux構成ファイルはありますか?ここではシリアルアダプタは問題ではないと思います。
これを実現するために、私はいくつかのUSB-シリアル(FTDI232)アダプターを使用します
USB 2.0HSプロトコルを使用するより優れたアダプターを入手してください。 FS HSハブ上のデバイス)の1つは、ホストが分割トランザクションプロトコルを使用する必要があることです。これは、ひどい複雑さによる実装の難しさで知られています。分割トランザクションに賭けることはありません。エンジンは、これまでに多数の安っぽいFS UARTブリッジでテストされました。
もう1つは、多くのUSB 2.0ハブには単一のTTがあるため、全体的なパフォーマンスが低下し、バッファリング/スケジューリングには非常に注意する必要があります。繰り返しになりますが、クレイジーなCDCポーリングプロトコルでは、すべての賭けをオフにする必要があります。 FT232Hをベースにしたより優れたUSB-UARTブリッジを入手してください。
直接ホスト接続とUSBハブ経由の接続の違いは、ホストの場合、トランザクションはネイティブFSプロトコルで直接実行されるのに対し、ハブ経由の接続には分割トランザクションで機能する特別なドライバーが必要なことです。スプリットトランザクションドライバーが弱い可能性があります。
USB2およびUSB3デバイスとインターフェイスを混在させる場合は慎重に行ってください。このような混合により、いくつかの問題が発生する可能性があります。さらに、一部のUSBハブは単にがらくたであることを忘れないでください。