我有一个串行程序通过两个不同的端口连接到两个设备。每当我阅读时,当然我都有一个本地缓冲区,其中静态分配了我愿意从串行读取的数据包大小。然而,我的老板指出,将数据包存储到这个本地缓冲区并不安全,而是他建议我每次从串行读取时检查我是否可以刷新 linux 操作系统缓冲区。你有什么意见?以及如何在 ubuntu 中以编程方式执行此操作?
如果我将 TCSAFLUSH 添加到 tcsetattr 函数,我想这个问题就解决了。这使得它在所有数据写入串行后刷新缓冲区。这发生在下一次阅读之前。希望如果我 usleep() 一段时间 ;) 如果你有什么意见呢?
最佳答案
您正在寻找的函数是 tcdrain(fd)
或 tcsetattr()
选项 TCSADRAIN
。
TCSAFLUSH
(和 tcflush()
)通过丢弃数据来清空缓冲区 - tcdrain()
等待(阻塞)直到所有数据都已完成从缓冲区发送:
Line control
...
tcdrain() waits until all output written to the object referred to by fd has been transmitted.
-- man termios
我在将端口选项重置为更改它们并关闭端口之前的状态之前使用该函数:
void SerialPort::close() {
if (_fd > -1) {
tcdrain(_fd);
ioctl(_fd, TCSETS2, &_savedOptions);
::close(_fd);
}
_fd = -1;
}
关于c - 刷新 linux OS 串行缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16398588/