Я читаю байты из последовательного порта на C++, используя файловый дескриптор и функцию read() posix/unix. В этом примере я читаю 1 байт из последовательного порта (настройки скорости передачи и похож опущены для ясности):Как я могу реализовать таймаут для чтения() при чтении из последовательного порта (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;
}
Если устройство подключено к/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-секундный тайм-аут?
Любая помощь приветствуется. Заранее спасибо :-)
Использование 'tcsetattr()' 'из VTIME' не просто; он требует других настроек режима, которые некоторые последовательные драйверы не поддерживают. См. Мой ответ для общего решения. – wallyk
Это лучшее объяснение, которое я нашел в Интернете для VMIN и VTIME [http://unixwiz.net/techtips/termios-vmin-vtime.html](http://unixwiz.net/techtips/termios- Vmin-vtime.html). Согласно статье, когда бит ICANON выключен, он позволяет «сырой режим» изменять интерпретацию VMIN и VTIME. Установка бита ICANON заставит код работать должным образом. – arpl