-1

オペレーティングシステム: Ubuntu

使用するシリアルポート: USB->シリアルアダプタ (豊富な PL2303)

サンプルのシリアル ポート読み取りおよび書き込みプログラムがあります。アプリケーションの実行中に、4100バイトを送信しようとしています。これを一発で実行できるプログラムを作成します。

n = write (s_port,msg,4100);

ここで「n」値を確認していますが、4100 です。

I*ストロング テキスト*n 受信側

n = read(s_port,msg,5000);

上記の行はループしています。1 回の読み取り試行で 32 バイト以下しか取得できません。そのため、128 回を超える読み取り試行 (32+32+32 など) を実行して、完全なバイト (4100) を取得します。

送信側では全バイトを一発でプッシュできるのに、なぜ一発で受信できないのでしょうか?

4

2 に答える 2

2

シリアル通信では、ボーレートによっては、個々のバイトの転送に時間がかかります。CPU は、受信したバイトを処理する際にはるかに高速です。

書き込みにより、シリアル通信デバイス インターフェイスは、送信されるバイトをバッファリングできます。ただし、読み取りは他のデバイスから受信したバイトを取得する必要があるため、タイムラグがあります。

これは、RS-232 シリアル通信規格に関するウィキペディアの記事です。

シリアル ポートを、パラレル ポートに関するこのウィキペディアの記事と比較してください。

パラレル ポートにはビットごとに 1 本のワイヤがあり、すべてのビットが同時に転送されるのに対し、シリアル ポートではビットが 1 つずつシリアルに転送されます。パラレル ポートは、シリアル ポートの速度がかなり遅かった時代に、プリンターなどの高速転送に使用されました。シリアル ポートの速度はここ数年で劇的に改善されましたが、それでも USB の速度には及びません。

于 2012-12-11T12:48:58.397 に答える
0

これは、シリアルから USB へのコンバーターの一般的な性質であり、小さなチャンクで受信されるデータを処理する必要があります。PL2303には64バイトのバッファがあると思いましたが、1回の読み取りで転送しようとしているものよりもはるかに下です.

また、非同期であるため、データのチャンクの開始と終了を指定する区切り文字がないため、チップ/ドライバーは、オンチップ バッファー サイズと実装する可能性のあるその他の規則に応じて、データ ストリームを分割する場所を決定する必要があります。データを USB パケットとして転送する前のタイムアウトなど。

于 2012-12-11T12:49:39.550 に答える