3

ねえ、私はしばらくの間これに取り組んでいますが、私はどこにも行きません

USBデバイスからバイトを取得しようとしています。これは1つまたは2つの回線が着信する場合は正常に機能しますが、かなりの数になると機能しません。

このコード行を使用してデータを取り込みます。

conn.bulkTransfer(epIN, buffer, 57600, 500);

データがなくなるまでUSB転送を何度も繰り返す方法はありますか?入ってくるデータの量は8バイトから数MBまで何でもあり得るので


user387184への返信

このようなもので大量のデータを転送できますか?

while ( conn.bulkTransfer(epIN, buffer, 57600, 500) > 0 ){
    \\do some stuff
}
4

2 に答える 2

2

コンバーターの下流にある (最終的に) シリアル デバイスと通信しようとする場合、送受信されるメッセージに終了文字があるようにプロトコルが設計されていると非常に便利です。これにより、さらに数ミリ秒以内にさらにデータが来るかどうかを推測する必要がなくなります。改行は非常に一般的な選択です。例えば:

ホスト: あなたの名前は?\n

デバイス: キャメロットのガラハッド卿。\n

ホスト: 好きな色は?\n

デバイス: 青\nいいえ、黄色\n

デバイスが "Blue" の後に \n で応答を終了した場合、ホストは 2 番目の明確な回答を期待しません。通常、デバイスがこのように「ルールを破った」場合に何が起こるかというと、ホストは、次に尋ねたものに対する答えを探すまで「いいえ、黄色」と読まないということです。応答し、デバイスにリセット コマンドを発行します。(一部のプロトコルでは、このような混乱を防ぐために、「質問を繰り返して応答を前に保留する」スキームがあります)

もちろん、終端文字を使用する以外に 2 つのよく知られている可能性があります。1 つは非常に省略されたコード (単一文字または潜在的に印刷不能なバイナリ) であり、長さの応答が期待されます (コードの先頭によって異なる可能性があります)。もう 1 つは、識別可能なヘッダー、長さフィールド、そしてデータという、パケット構造の邪魔になるものです。

ただし、要点は、「これ以上あるかどうかを確認する」プロトコルは、主に 2 人の間、または人と自動化されたシステムの間で使用されるということです。自動化されたシステムが互いに通信するとき、それらは代わりにプロトコルを使用する傾向があります。これは、それ以上のシステムがあるかどうかを知る方法を定義します。 最終的なダウンストリーム エンドポイント デバイスのファームウェアの作成者が自分の仕事を知っていれば、より多くのデータを期待する必要がある場合とそうでない場合の明確なルールが存在します。

于 2012-06-07T15:42:00.183 に答える
1

データがなくなったときに USB 接続が実際にデータの受信を停止する場合は、ステートメントの周りに while receivedBufferIsNotEmpty を配置するだけです。

lenOfReceivedBuffer = conn.bulkTransfer(epIN, buffer, 57600, 500);

0 in lenOfReceivedBuffer500 ミリ秒のタイムアウトを使用して、ポート上でこれ以上データが見つからない場合に取得します。

送信側が遅すぎる場合は、タイムアウトを少し増やすこともできます。

于 2012-06-07T13:21:33.227 に答える