2011-11-10 5 views
4

期待しないシリアルポートで奇妙な動作が見られるシステムがあります。私はこれまで、USBシリアルアダプターを使ってこれを見たことがありますが、今ではそれをネイティブのシリアルポートでも見ています。デバイスを開くときにLinuxのシリアルポートバッファが空でない

システムは自動テストを実行するように設定されており、ポートが開いていない間にシリアルデバイスから大量のデータが出力されるようなタスクを最初に実行します。また、デバイス自体もリセットされます。 tx/rx回線のみが接続されています。フロー制御はありません。

これらのタスクが完了すると、テストウェアはシリアルポートを開き、予期しない応答が発生するため、直ちに失敗します。これを再現すると、ターミナルプログラムでシリアルポートを開くと、ポートが閉じられたときに送信された数キロバイトの古いデータがすぐにフラッシュされることがわかりました。このプログラムを閉じると、テストを期待どおりに実行できます。

何が起こる可能性がありますか?デバイスが閉じられたときに、Linuxはシリアルポートのバッファリングをどのように処理しますか?デバイスを開いて、出力を送信させてから、それを読み取らずに閉じた場合、同じ問題が発生しますか?

答えて

4

Linux端末ドライバは、開いていなくても入力をバッファします。これは便利な機能です。特にスピード/パリティ/その他の場合は便利です。適切に設定される。

が低いオペレーティング・システムの動作を再現するには、できるだけ早くそれが開いているように、ポートからの保留中のすべての入力をお読みください。私はそれが事実であるかもしれないことを考えていた

... 
int fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC); 
if (fd < 0) 
     exit (1); 

set_blocking (fd, 0); // disable reads blocked when no input ready 

char buf [10000]; 
int n; 
do { 
     n = read (fd, buf, sizeof buf); 
} while (n > 0); 

set_blocking (fd, 1); // enable read blocking (if desired) 

... // now there is no pending input 



void set_blocking (int fd, int should_block) 
{ 
     struct termios tty; 
     memset (&tty, 0, sizeof tty); 
     if (tcgetattr (fd, &tty) != 0) 
     { 
       error ("error %d getting term settings set_blocking", errno); 
       return; 
     } 

     tty.c_cc[VMIN] = should_block ? 1 : 0; 
     tty.c_cc[VTIME] = should_block ? 5 : 0; // 0.5 seconds read timeout 

     if (tcsetattr (fd, TCSANOW, &tty) != 0) 
       error ("error setting term %sblocking", should_block ? "" : "no"); 
} 
+0

。だから、なぜ私はこの行動を時間の中でしか見ないのだろうか?私はテストのためにpyserialを使用しています。また、付属のminiterm.pyスクリプトを対話型端末として使用しています。この問題が発生しているのはシリアルポートだけではありません。それは交互に見える。すべてのシリアルポートは、データが閉じられているときにデータを受信しますが、開かれた時点で1つだけバッファリングされます。おそらく、ボーレートはその上に正しく設定されたままになっているだけでしょうか? – djs

+0

@ djs:ポートスピードは私の頭に浮かぶ最初のものです。また、 'gpsd'や' logind'がGPSデバイスやログイン接続を探しているクローズドポートにアクセスしており、ポート速度を推測的に変更している可能性もあります。 – wallyk

+0

いずれのサービスも実行されていません。 sttyは私がチェックする前に115200番のすべてのポートを報告し、そのうちの1人だけがバッファを保有していることを発見しました。これはボーレートを確認するのに適したツールですか? – djs