USBハブがUSB-シリアルアダプタからデータをドロップする

USBハブがUSB-シリアルアダプタからデータをドロップする

現在、シリアル デバイス (主に ARM ボード) からデータを受信する必要のあるシステムを設計しています。これを実現するために、USB シリアル (FTDI232) アダプターをいくつか使用しています。セットアップをテストするために、簡単なループバック プログラム (9600 ボー) をコーディングし、ARM ボードをフラッシュしたところ、送信したすべてのデータをデータ損失なしで正常に受信できました。

しかし、このシステムは最終的に多くのボードと通信する必要があります。そのため、USB ハブを USB ポートに接続し、それを使用してより多くのボードを接続しました。しかし、数日後、いくつかの問題に気付きました。最初は、いくつかのビットフリップが発生したように見えました。その後、ボードからメッセージを受信すると、バイト全体がドロップされることが判明しました。これらのアダプターを通常の USB ポートに接続すると (間にハブを介さずに)、問題はなくなりました。

これはバッファリングの問題だと推測しました。シリアル コントローラまたはデバイスがデータを送信しすぎている可能性があります。そのため、シリアル側に RTS/CTS フロー制御をインストールしました。この場合も、バイトは USB ハブによってドロップされており、シリアル アダプタが PC に直接接続されているときにはドロップされていません。

USB ハブをより高価なものに交換しましたが、何も変わりませんでした。PC を変更しましたが、問題は解決しませんでした。さらに、ハブはシリアル アダプタに送信しているパケットをドロップせず、シリアル アダプタによって送信されたパケットのみをドロップするのは混乱を招きます。

これを解決する方法、または問題の原因を知っている人はいませんか? USB ハブが原因だと考えています。ただし、多くのデバイスを接続する必要があるため、USB ハブに依存しています。そのため、独自のシリアル処理ソリューション (専用 FPGA または Pi ベース) を作成する前に、ここで何が起こっているのか知っている人がいないか尋ねたいと思いました。ポーリングの問題である場合、ポーリングを高速化できる Linux 構成ファイルはありますか? この場合、シリアル アダプターは問題ではないと思います。

答え1

これを実現するために、USB-シリアル(FTDI232)アダプタを使用します。

USB 2.0 HS プロトコルを使用する、より優れたアダプタを入手してください。HS ハブ経由の FS デバイスで問題となるのは、ホストが分割トランザクション プロトコルを使用する必要があることです。このプロトコルは、非常に複雑であるため、実装が困難であることが知られています。分割トランザクション エンジンが、多数の粗悪な FS UART ブリッジでテストされたことは、まずありません。

もう 1 つは、多くの USB 2.0 ハブには TT が 1 つしかないため、全体的なパフォーマンスが悪く、バッファリング/スケジュール設定に細心の注意を払う必要があることです。また、CDC ポーリング プロトコルが狂っているため、すべてが台無しになります。FT232H をベースにした、より優れた USB-UART ブリッジを入手してください。

直接ホスト接続と USB ハブ経由の接続の違いは、ホストの場合はトランザクションがネイティブ FS プロトコルで直接実行されるのに対し、ハブ経由の接続では分割トランザクションで動作する特別なドライバーが必要になることです。分割トランザクション ドライバーが弱い可能性があります。

答え2

USB2 と USB3 のデバイスやインターフェースを混在させる場合は注意してください。混在させると問題が発生する場合があります。また、一部の USB ハブは単純に役に立たないことを覚えておいてください。

関連情報