2012-01-27 9 views
1

シリアルポートを使用するUbuntuのコンソールアプリケーションを作成しています。シリアルポートから60Hzで読み書きする必要があります。POSIXシリアルポートのread()が遅い理由は何ですか?

私は、read()の呼び出しは、しばしば遅いが、必ずしも遅くないことがわかります。私はO_NDELAYを設定しているので、しばしば即座に(素晴らしい)返します。時には仕上げに50ミリ秒かかることがあり、それは私のアプリケーションにとっては遅すぎます。 read()を呼び出す前に、使用可能な文字数を調べるので、データを待ってはいけません。

これは時間がかかりすぎるread()とは何ですか?どうすればスピードアップできますか?私は、select()以前使用していのだが、それは問題に直交であることが判明:

options.c_cflag |= (CLOCAL | CREAD); 
options.c_cflag &= ~PARENB; 
options.c_cflag &= ~CSTOPB; 
options.c_cflag &= ~CSIZE; 
options.c_cflag |= CS8; 

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
options.c_iflag &= ~IXON; 

options.c_oflag = 0; 

編集:ポート上の

オプションがあります。私の最新情報で更新されました。

+0

を参照してください。おそらく、カーネルは少なくとも1バイトの全バイトを読み取る必要があります。 –

+0

ハードウェアの特定の部分(たとえば、ハードウェア仕様でそうであること)が必要な場合や、OSにステータスを取得するためにOSに不具合があった場合などです。 –

+0

@Basile:115200 – amo

答えて

0

selectは何をしているのではなく、システムがやっていることです。あなたのスレッドは最終的にタイムスライスを使い切り、システムは他のコードの実行を許可します。すぐに戻るのではなく、時間切れのタイムアウトを使用すると、システムはプロセスを対話型として扱い、遅延がなくなるはずです。

0タイムアウトのある単一のディスクリプタにselectというメッセージがある場合は、その内容を把握することができません。単に操作を試みて、EWOULDBLOCKエラーが表示されるのはなぜですか?

あなたは何もしなくてもシステムが他のプロセスを実行できるように、時間切れのタイムアウトを使用してみませんか?

+0

私はselect()を削除しましたが、それは必要ないので正しいです。あなたが見ていないのは、コードのどこかでプロセッサーの生産があるということです。私はこれにusleep()を使っていましたが、私は高解像度のタイマーが良いかどうか調べています。読んでいるものがあるかどうかに関わらず、ブロードキャストするものがあるので、私は読んでブロックすることはできません。 – amo

+0

次の放送までどれくらいの時間がかかり、その間は 'select'でブロックされます。これは 'usleep'よりはるかにうまくいくでしょう。 –

+0

read()コールのスリープ時間は3倍です。 – amo

関連する問題