2016-08-09 17 views
0

PC上のアプリケーションが、1 KBのチャンクで埋め込みデバイスにファイル(2 MB)を送信します。FTDIドライバ(Windows)大きい(1KB)チャンクの問題 - (バージョン2.12.16.0)

私は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のデバイスにデータを書き込むときは、できるだけ限り多くのデータが アプリケーションにバッファリングして記述する必要があります write関数呼び出し( Win32 APIを使用するVCPアプリケーションの場合はWriteFile、D2XXクラシックインターフェイスを使用する場合はFT_Write、D2XX FT_W32インターフェイスを使用する場合は FT_WriteFileのいずれか)でデバイスに接続します。この の結果は、データがUSB パケットごとに64バイトでデバイスに書き込まれることです。

どのようなアイデアがこれらの問題の適切な修正ですか?それはFTDIの初期化に関連していますか?私のドライバのバージョンは2.12.16.0(3/9/2016)です。

答えて

2
  1. 私も自分のUSBデバイスNusbioのためのライブラリでの作業中にあまりにも多くのデータは、 を渡された場合は、右に動作していない)API FT_Write(の同じ問題を見ました。 私は主にUARTではなく同期ビットバンギングモードで動作しますが、結局のところ、同じ ハードウェア、ドライバ、APIです。

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

  3. 2015年に私はFTDIチップFT232RLのサイズが384バイトで、 であり、チップのデータシート(128バイトの受信バッファと256バイトの送信バッファ)から得られたという印象を受けました。 500バイトのサイズを使用すると動作しますが、600バイトを超えると動作しません。

    私は後で、より大きなバッファ(1k、512バイトの受信バッファと512バイトの送信バッファ)を持つチップFT231Xを使用しました。 であり、FT_Write()で1kと2kのデータバッファで転送することができ、転送速度が倍以上になりました。 しかし、2k以上のものはうまくいかないでしょう。2016年に

  4. 、私はあなたがFTDIのUSB 2.0フルスピードチップについて読むことができますすべてのものを読んで、私はFT_Writeが64Kまでサポートする必要があります 結論に達した(以下チップ FT232RL、FT231X、FT232H、についてはデータシートを参照してくださいFT260、FT4222)。

また、私はfaster serial port communication from .NET than 115200 baudについていくつかの研究を行った。

何とか私はFT_Write()で32kのバッファにデータを送るために私のC#ライブラリを更新できました。それは FT232RLとFT231Xチップで動作しますが、何が変わったかは分かりません。 私はおそらく、USB 2.0フルスピードFTDI技術の中と外を完全に打ち負かすことはなかったでしょう。

たとえば、FT232RLを使用していて、その時点で3835バイトを FT_Write()で転送しているとします。 USB 2.0のフルスピードで少なくとも1ミリ秒のレイテンシがあることを知っていると、 の場合、USBの観点から384 * 1000/1024の転送速度で転送されます。理論上は375 Kバイト/秒です。 最大値になるでしょう)、あなたの組み込み機器でサポートされているボーレートは何ですか? 使用されるボーレートは何ですか? FT232RLの最大ボーレートは900 000ボーで、900000 /(1 + 8 + 1)== 87 Kバイト/ Sしか得られません。 すぐにあなたには何か問題があると言えるでしょう、FTDIのドライバーが の世話をするかもしれません。私は言うことができません。 組み込みデバイスでサポートされているボーレートに基づいて数学を行い、384バイトのバッファー が毎秒1000回送信された後、スリープ()でUSB速度を遅くしてボーレートに合わせます。

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

+0

ありがとうございました! – Hary