FTDI 2232Hチップに基づいてカスタムデバイスからデータを受信しようとしています。Android USBホスト - bulkTransfer()がデータを失う
私は単純な非同期FIFOモードを使用しており、入力データレートは3.2MB /秒です。
すべては私のPCのテストコードではうまく動作しますが、私は東芝グライダーでデータを受信する際に問題があります。
TDIのAndroidドライバが失敗するため、Javaを使用してコーディングしています。
私は95%+のデータを完全に受け取ることができますが、しばらくの間、データは「スパッター」し、同じ4-5Kのデータの部分を2〜3回取得してから、良いデータに戻ります。
以前はデータが2倍(6.4MB /秒)で受信していたため、ThriveやAndroidではあまり速く進まず、その約95%も得ました。 (したがって、レートの半分で問題はありません)
Android内で発生するバッファリング(またはダブルバッファリング)に何らかのバグがあるようです。 (繰り返しデータがチップの4K内部バッファよりも大きいため、FTDI 2232H内のバッファではありません)
セットアップコードはシンプルで、やはりほぼ完璧です。
データのグラブが発生したループは非常に簡単です:
場合while(!fStop)
if(totalLen < BIG_BUFF_LEN-IN_BUFF_LEN)
{
len=conn.bulkTransfer(epIN, inBuff, IN_BUFF_LEN, 0);
System.arraycopy(inBuff, 0, bigBuff, totalLen, len);
totalLen+=len;
}
あなたはそれがのarraycopyのための時間の遅れだと思う - 私はその行をコメントアウトしても、私はまだ、データを失います。
IN_BUFF_LENは16384です(inBuffのサイズを大きくしても、bulkTransferはそれ以上戻りません)。
bigBuffは数メガバイトです。第二の問題として
- 誰でもbulkTransferへのポインタを渡す方法を知っているオフセット(位置から開始しないで---直接bigBuffに移入されます「0」
この回答を解決するには? –
おそらくアンドロイドはこれらの時間の間にガベージコレクションを行い、何かが失われています。あなたがデータを失ったときにOSで起こっていることを突き合わせることができるかどうかについては、logcatを調べてください。 – RightHandedMonkey
奇妙な問題です。なぜなら、FIFOを使用すると決して起こらないはずです。 FIFOを読み込むと、データが消えるからです。あなたはFIFOを読む前に毎回バッファをクリアしようとしましたか?つまり、同じデータをFIFOからではなくバッファから2回読み取らないようにします。 – fonZ