0

PC 上の私のアプリケーションは、ファイル (2 MB) を 1 KB のチャンクで組み込みデバイスに送信します。

私は FTDI Windows ドライバーを使用しています。私のコードはクロスプラットフォームであるため、従来の FT_Write() API 関数を使用しています。

注:以下の問題は、1KB のチャンク サイズを使用した場合に発生します。小さいチャンク (私は 64 バイトを試しました) は問題なく動作します。

問題は、関数が数百パケットごとに「0 バイト送信」を返し、スタックすることです。TX と Rx の両方を消去し、続いて ResetDevice() を呼び出してチップを回復するという回避策を見つけました。それでも数百パケットごとに発生しましたが、少なくともファイル全体 (2 MB) を送信できます。

しかし、USB アイソレーター ( http://www.bb-elec.com/Products/USB-Connectivity/USB-Isolators/Compact-USB-Port-Guardian.aspx ) を使用すると、回避策に失敗しました。

私の回避策は優雅な解決策ではないと思います。

注: 以下の FTDI アプリケーション ノートで見つけた提案のため、大きなチャンクを使用します。

FTDI デバイスにデータを書き込む場合、できるだけ多くのデータをアプリケーションでバッファリングし、1 回の書き込み関数呼び出しでデバイスに書き込む必要があります(Win32 API を使用する VCP アプリケーションの場合は WriteFile、D2XX クラシック インターフェイスを使用する場合は FT_Write、またはD2XX FT_W32 インターフェイスを使用している場合は FT_WriteFile)。この結果、データは USB パケットあたり 64 バイトでデバイスに書き込まれます。

これらの問題の適切な修正は何ですか? FTDIの初期化に関連していますか? 私のドライバーのバージョンは 2.12.16.0 (2016 年 3 月 9 日) です。

4

1 に答える 1

2
  1. また、USB デバイス Nusbio のライブラリで作業しているときに、あまりにも多くのデータが渡された場合に API FT_Write() が正しく機能しないという同じ問題も見ました。私はほとんどの場合、UART ではなく Synchronous Bitbanging モードで作業しますが、結局のところ、ハードウェア、ドライバー、および API は同じです。

  2. USB2.0仕様やFTDI FT232RL仕様があり、電子とビットのリアリティがあります。予想される転送速度の数値は、少なくとも最初は決して一致しません。言い換えれば、それは複雑です (以下の参考ブログ記事を参照してください)。

  3. 2015 年には、FTDI チップ FT232RL では 384 バイトのサイズがうまく機能し、その数値はチップのデータシート (128 バイトの受信バッファーと 256 バイトの送信バッファー) に由来するという印象を受けました。500 バイトのサイズを使用しても機能しますが、600 バイトを超えると機能しません。

    私は後に、より大きなバッファ (1k、512 バイトの受信バッファと 512 バイトの送信バッファ) を持つチップ FT231X を使用しました。FT_Write() で 1k および 2k のデータ バッファを転送できたため、転送速度が 2 倍以上になりました。しかし、2kを超えると機能しません。

  4. 2016 年に、私は FTDI USB 2.0 フルスピード チップについて読めるものをすべて読み、FT_Write は最大 64K をサポートする必要があるという結論に達しました (次のチップ FT232RL、FT231X、FT232H、FT260、FT4222 のデータシートを参照してください)。

また、115200 ボーよりも高速な .NET からのシリアル ポート通信についても調査しました。

どういうわけか、FT_Write() で 32k のバッファでデータを送信するように C# ライブラリを更新することができ、FT232RL および FT231X チップで動作していますが、何が変わったのかわかりません。私はおそらく、USB 2.0 フルスピード FTDI テクノロジーのインとアウトを完全に理解しているわけではありませんでした。

たとえば、FT232RL を使用していて、FT_Write() で一度に 384 バイトを転送しているとします。USB 2.0 のフル スピードで何をしても少なくとも 1 ミリ秒の遅延があることを知っていると、USB の観点から 384*1000/1024、つまり理論的には 375 K バイト/秒 (つまり最大)、組み込みデバイスでサポートされているボーレートは何ですか。使用されるボーレートは何ですか? FT232RL の最大ボーレートは 900 000 ボーで、900000/(1+8+1) == 87 K バイト/S しか得られません。FTDI ドライバーが問題を処理するかどうかに関係なく、何らかの問題が発生する可能性があることがすぐにわかります。わかりません。組み込みデバイスでサポートされているボーレートと、1 秒あたり 1000 を送信する 384 バイトのバッファに基づいて計算をやり直してから、ボーレートに一致するように sleep() で USB 速度を遅くします。

それが私が始めるところです。

于 2016-12-14T03:54:04.413 に答える