c - 刷新 linux OS 串行缓冲区

标签 c linux-device-driver ubuntu-11.04

我有一个串行程序通过两个不同的端口连接到两个设备。每当我阅读时,当然我都有一个本地缓冲区,其中静态分配了我愿意从串行读取的数据包大小。然而,我的老板指出,将数据包存储到这个本地缓冲区并不安全,而是他建议我每次从串行读取时检查我是否可以刷新 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/

相关文章:

c - 在ubuntu上运行C程序

c - C 中的按引用传递 - 缺点?

c - 对除第一个元素之外的所有内容进行排序,qsort C

c - libpcap - 数据包 ip header 长度为零字节,带有环回 tcp 请求

linux - 定时器中断和进程滴答

linux - pci_Driver.probe 未被调用

Linux:重新加载内核模块

linux - 如何在 Linux 上将 git 更新到最新版本?

linux - 在 bash 文件末尾添加一行

c++ - 在 Cygwin 中链接 Conio 函数