flush linux OS串口缓冲区

时间:2013-05-06 12:16:30

标签: c linux-device-driver ubuntu-11.04

我有一个串行程序通过两个不同的端口连接到两个设备。每当我读到的时候,我当然有一个静态分配的本地缓冲区,我愿意从串口读取数据包的大小。然而,我的老板指出,将数据包存储到本地缓冲区并不安全,而是建议每次我从串口读取时检查是否可以刷新linux OS缓冲区。你有什么意见?如何在ubuntu中以编程方式执行此操作?

如果我将TCSAFLUSH添加到tcsetattr函数,我认为这个问题就解决了。这使得它在所有数据写入串行后刷新缓冲区。这发生在下次阅读之前。希望如果我睡觉()一段时间;) 如果你的意见怎么样?

1 个答案:

答案 0 :(得分:-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;
}