Unix:如何清除串口I / O缓冲区?

时间:2014-02-25 15:11:06

标签: c++ c unix serial-port

我正在为标准PC串口开发“高级”C ++接口。当我打开端口时,我想清除输入和输出缓冲区,以便不接收或发送先前使用该端口的数据。为此,我使用tcflush函数。但是,它不起作用。怎么可能?我的“端口开放”代码如下所示。是的我使用C ++异常但没有被抛出。这表明tcflush返回0但它没有清除缓冲区。

我可以清除输入缓冲区的唯一方法是从中读取字节,直到没有剩余。这通常需要几秒钟,我不认为它是一种解决方案。

提前致谢: - )

fd = ::open(port.c_str(), O_RDWR | O_NOCTTY);

if (fd < 0)
{
    throw OpenPortException(port);
    return;
}

// Get options
tcgetattr(fd, &options);

// Set default baud rate 9600, 1 stop bit, 8 bit data length, no parity
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

// Default timeout (1000 ms)
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;

// Additional options
options.c_cflag |= (CLOCAL | CREAD);

this->port = port;

// Apply the settings now
if (tcsetattr(fd, TCSANOW, &options) != 0)
{
    throw PortSettingsException();
}

// Flush the port
if (tcflush(fd, TCIOFLUSH) != 0)
{
    throw IOException();
}

2 个答案:

答案 0 :(得分:3)

尝试

  

ioctl(fd,TCFLUSH,dir)

dir等于0表示接收,1表示发送,2表示两者。

答案 1 :(得分:2)

这是正确的方法(如下所示):

usleep(1000);
ioctl(fd, TCFLSH, 0); // flush receive
ioctl(fd, TCFLSH, 1); // flush transmit
ioctl(fd, TCFLSH, 2); // flush both

用户可以根据需要选择前2行或最后一行。请检查是否需要睡觉。