Открываю последовательный порт под Linux. Как-то так:
int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
termios options;
tcgetattr(fd, &options);
options.c_cflag |= CLOCAL | CREAD;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
options.c_cflag &= ~CRTSCTS;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~PARENB;
cfsetspeed(&options, B115200);
options.c_cc[VMIN] = 10;
options.c_cc[VTIME] = 20;
tcsetattr(fd, TCSAFLUSH, &options);
char buffer[10];
int count = read(fd, buffer, sizeof(buffer));
printf("count = %i\n", count);
Я ожидаю, что при отсутствии символов, приходящих через последовательный порт, программа завершится через 2 секунды (установленное значение c_cc[VTIME]), однако она зависает в бесконечном ожидании.
Если же убрать вызов fcntl, то read мгновенно возвращает 0 байт, но я то хочу, чтобы он подождал.
ЧЯДНТ?
P. S.: Я знаю про select, однако он не позволяет задать, сколько именно байт я хочу получить через порт - ожидание прервётся даже если придёт 1 байт, а в данном примере я жду сразу 10.
P. P. S.: Я работаю с виртуальным COM-портом, созданным микросхемой FT232RL.