Estoy leyendo bytes desde un puerto serie en C++ usando un descriptor de archivo y la función posix/unix read(). En este ejemplo, estoy leyendo 1 byte desde el puerto serie (ajustes de velocidad de transmisión y similar se han omitido para mayor claridad):¿Cómo puedo implementar el tiempo de espera para leer() al leer desde un puerto serie (C/C++)
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
char buf[1];
int bytesRead = read(fd, buf, 1);
close(fd);
return 0;
}
Si el dispositivo conectado a/dev/ttyS0 no envía ninguna información, el programa colgar. ¿Cómo puedo establecer un tiempo de espera?
He intentado fijar un tiempo de espera de esta manera:
struct termios options;
tcgetattr(fd, &options);
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
tcsetattr(fd, TCSANOW, &options);
pensé que iba a dar 1 segundo tiempo, pero no hace ninguna diferencia. Creo que he entendido mal a VMIN y VTIME. ¿Para qué se utilizan VMIN y VTIME?
Luego busqué en la web y encontré a alguien hablando de la función select(). ¿Es esa la solución y, de ser así, cómo se podría aplicar eso al programa anterior para hacer un tiempo de espera de 1 segundo?
Cualquier ayuda es apreciada. Gracias de antemano :-)
Uso de 'tcsetattr()' 'de VTIME' no es sencilla; requiere otras configuraciones de modo que algunos controladores serie no son compatibles. Ver mi respuesta para una solución general. – wallyk
Esta es la mejor explicación que he encontrado en la web para VMIN y VTIME [http://unixwiz.net/techtips/termios-vmin-vtime.html](http://unixwiz.net/techtips/termios- vmin-vtime.html). Según el artículo, cuando el bit ICANON está desactivado, habilita un "modo en bruto" que cambia la interpretación de VMIN y VTIME. Configurar el bit ICANON haría que el código funcionara como se esperaba. – arpl