Unix: ¿Cómo borrar el búfer de E / S del puerto serie?
Estoy trabajando en una interfaz C ++ de "alto nivel" para el puerto serie estándar de la PC. Cuando abro el puerto, me gustaría borrar los búferes de entrada y salida para no recibir ni enviar datos del uso anterior del puerto. Para hacer eso, uso la función tcflush. Sin embargo, no funciona. ¿Como puede ser? Mi código de "apertura de puerto" se puede ver a continuación. Sí, uso excepciones de C ++ pero no se lanza ninguna. Eso indica que tcflush devuelve 0 pero no borra el búfer.
La única forma en que puedo borrar el búfer de entrada es leer bytes de él hasta que no quede ninguno. Esto generalmente toma un par de segundos y no lo considero una solución.
Gracias por adelantado :-)
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();
}