Как реализовать тайм-аут для read() при чтении из последовательного порта (C/C++)

Я читаю байты из последовательного порта в C++, используя файловый дескриптор и функцию posix/unix read(). В этом примере я считываю 1 байт из последовательного порта (настройки скорости передачи данных и тому подобное опущены для ясности):

#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;
}

Если устройство, подключенное к /dev/ttyS0, не отправляет никакой информации, программа зависнет. Я установил тайм-аут?

Я попытался установить тайм-аут следующим образом:

struct termios options;
tcgetattr(fd, &options);
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
tcsetattr(fd, TCSANOW, &options);

Я думал, что он должен дать 1-секундный тайм-аут, но это не имеет значения. Я думаю, что неправильно понял VMIN и VTIME. Что такое VMIN и VTIME используется для?

Затем я поискал в Интернете и нашел, что кто-то говорит о функции select(). Является ли это решением, и если да, то как можно применить это к программе выше, чтобы сделать 1-секундный тайм-аут?

Любая помощь приветствуется.Спасибо заранее :-)

13
задан pvh1987 9 May 2012 в 18:49
поделиться