【问题标题】:flush linux OS serial buffer刷新 linux OS 串行缓冲区
【发布时间】:2013-05-06 12:16:29
【问题描述】:

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

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

【问题讨论】:

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

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


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多