C 刷新linux操作系统串行缓冲区

C 刷新linux操作系统串行缓冲区,c,linux-device-driver,ubuntu-11.04,C,Linux Device Driver,Ubuntu 11.04,我有一个串行程序通过两个不同的端口连接到两个设备。当然,每当我读取时,我都会有一个本地缓冲区,它是静态分配的,数据包的大小是我愿意从串行数据中读取的。然而,我的老板指出,将数据包存储到本地缓冲区是不安全的,他建议我在每次读取串行数据时检查是否可以刷新linux操作系统缓冲区。你的意见是什么?我如何在ubuntu中通过编程实现这一点 如果我将TCSAFLUSH添加到tcsetattr函数中,我认为这个问题会得到解决。这使得它在所有数据写入串行数据后刷新缓冲区。这发生在下一次阅读之前。希望我能睡一段

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


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

您正在寻找的函数是
tcdrain(fd)
tcsetattr()
选项
TCSADRAIN

TCSAFLUSH
(和
tcflush()
)通过丢弃数据清空缓冲区-
tcdrain()
等待(阻塞),直到从缓冲区发送所有数据:

线路控制

tcdrain()等待,直到fd引用的对象中写入的所有输出都已传输

--曼特米奥斯

在将端口选项重置为更改前的状态并关闭端口之前,我使用了该功能:

void SerialPort::close() {
    if (_fd > -1) {
        tcdrain(_fd);
        ioctl(_fd, TCSETS2, &_savedOptions);
        ::close(_fd);
    }
    _fd = -1;
}

TTY通常作为常规文件进行管理,您可以使用fflush()。因此,在写作时,冲洗是有意义的。当读取时,只需消耗所有字节。我这样说是因为连接可能有噪音。所以,在write()之后使用fflush()就可以了,不是吗?很长时间以来,我在C中使用RS232,实际上它会刷新TTY上所有剩余的字节。fflush是标准库的。我正在寻找系统调用。如果我将TCSAFLUSH添加到tcsettr函数中,我认为这个问题会得到解决\