1

2 つの異なるポートを介して 2 つのデバイスに接続するシリアル プログラムがあります。もちろん、読み取るときはいつでも、シリアルから読み取ろうとしているパケットのサイズで静的に割り当てられたローカルバッファーがあります。しかし、私の上司は、このローカル バッファにパケットを格納するのは安全ではないと指摘し、シリアルから読み取るたびに Linux OS バッファをフラッシュできるかどうかを確認するようアドバイスしました。あなたの意見は何ですか?ubuntuでプログラムでそれを行うにはどうすればよいですか?

tcsetattr 関数に TCSAFLUSH を追加すれば、この問題は解決すると思います。これにより、すべてのデータがシリアルに書き込まれた後にバッファがフラッシュされます。これは、次の読み取りの直前に発生します。うまくいけば、しばらくの間sleep()を使用できればいいのですが;)あなたの意見はどうですか?

4

1 に答える 1

-1

あなたが探している機能はtcdrain(fd)、またはtcsetattr()オプションTCSADRAINです。

TCSAFLUSH(およびtcflush())データを破棄してバッファを空にします -tcdrain()すべてのデータがバッファから送信されるまで待機(ブロック)します。

ラインコントロール

...

tcdrain() は、fd によって参照されるオブジェクトに書き込まれたすべての出力が送信されるまで待機します。

-- man termios

ポートオプションを変更前の状態にリセットする直前に関数を使用して、ポートを閉じます。

void SerialPort::close() {
    if (_fd > -1) {
        tcdrain(_fd);
        ioctl(_fd, TCSETS2, &_savedOptions);
        ::close(_fd);
    }
    _fd = -1;
}
于 2015-11-04T17:02:14.497 に答える