Sto leggendo i byte da una porta seriale in C++ usando un descrittore di file e la funzione posix/unix read(). In questo esempio, sto leggendo 1 byte dalla porta seriale (impostazioni baud rate e simile sono omessi per chiarezza):Come posso implementare il timeout per read() durante la lettura da una porta seriale (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;
}
Se il dispositivo collegato alla/dev/ttyS0 non invia alcuna informazione, il programma appendere. Come posso impostare un timeout?
Ho provato a fissare un momento come questo:
struct termios options;
tcgetattr(fd, &options);
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
tcsetattr(fd, TCSANOW, &options);
ho pensato che avrebbe dovuto dare 1 secondo timeout, ma non fa alcuna differenza. Penso di aver frainteso VMIN e VTIME. Per cosa vengono utilizzati VMIN e VTIME?
Quindi ho cercato sul web e ho trovato qualcuno che parla della funzione select(). È questa la soluzione e, in caso affermativo, come si applicherebbe questo al programma di cui sopra per fare un secondo timeout?
Qualsiasi aiuto è apprezzato. Grazie in anticipo :-)
Usando 'tcsetattr()' di 'VTIME' non è semplice; richiede altre impostazioni di modalità che alcuni driver seriali non supportano. Vedi la mia risposta per una soluzione generale. – wallyk
Questa è la migliore spiegazione che ho trovato sul web per VMIN e VTIME [http://unixwiz.net/techtips/termios-vmin-vtime.html](http://unixwiz.net/techtips/termios- Vmin-vtime.html). Secondo l'articolo quando il bit ICANON è disattivato abilita una "modalità raw" che modifica l'interpretazione di VMIN e VTIME. L'impostazione del bit ICANON renderebbe il codice funzionante come previsto. – arpl