10

Ubuntu Linux で C++ のアプリケーションを作成して、シリアル ポートからデータを読み取ります。select()私のコード呼び出しによって正常に動作し、ioctl(fd,FIONREAD,&bytes_avail)最終的に を使用してデータを取得する前に、利用可能なバイト数を調べますread()

私の質問は次のとおりです。データが返されるたびselectに、使用可能なバイト数が 8 と報告されます。これはどこかに設定されたバッファー サイズであり、このバッファーがいっぱいになると、select がユーザーに通知を返すと推測しています。

私は開発者として Linux を初めて使用しますが (C++ は初めてではありません)、このバッファーのサイズを変更できるかどうか、または実際に私の仮定が正しいかどうかを調査しようとしました (成功しませんでした)。私のアプリケーションではタイミングが重要であり、読み取りバッファーに新しいバイトがあるたびにアラートを受け取る必要があります。カーネルコードを掘り下げることなく、これは可能ですか?

4

2 に答える 2

4

TIOCSSERIAL受信バッファーの深さと送信バッファーの深さの両方を (特に) 変更できるシリアル IOCTL を使用する必要があります。最大値はハードウェアによって異なりますが、16550A が使用されている場合、最大バッファ深度は 14 です。

ここでやりたいことと似たようなことをするコードを見つけることができます

元のリンクはうまくいきませんでした: http://www.groupsrv.com/linux/about57282.html 新しいものは、私が別のものを書くか、より良い例を見つけるまでしなければなりません。

于 2012-05-30T13:42:56.443 に答える
1

termios 構造体の c_cc メンバーの VMIN および VTIME 値を試してみることができます。ここ、特にセクション 3.2 にいくつかの情報があります。

于 2012-07-03T09:04:36.987 に答える