Unix: Como limpar o buffer de E / S da porta serial?

Estou trabalhando em uma interface C ++ de "alto nível" para a porta serial do PC padrão. Quando abro a porta, gostaria de limpar os buffers de entrada e saída para não receber ou enviar dados do uso anterior da porta. Para fazer isso, eu uso a função tcflush. No entanto, isso não funciona. Como pode ser? Meu código de "abertura de porta" pode ser visto abaixo. Sim, eu uso exceções em C ++, mas nenhuma está sendo lançada. Isso indica que tcflush retorna 0, mas não limpa o buffer.

A única maneira de limpar o buffer de entrada é ler bytes dele até que não haja mais nenhum. Isso geralmente leva alguns segundos e eu não penso nisso como uma solução.

Desde já, obrigado :-)

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();
}

questionAnswers(2)

yourAnswerToTheQuestion