Я читаю байты из последовательного порта в 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-секундный тайм-аут?
Любая помощь приветствуется.Спасибо заранее :-)