struct termios tconf;
tcgetattr(fd, &tconf);
tconf.c_cc[VTIME] = timeout / 100;
tcsetattr(fd, TCSANOW, &tconf);
Таймаут при чтении из серийного порта
Устанавливаю я него примерно так:
Код:
Если параметр timeout меньше 2500 мс, тогда тайумаут работает как надо. Если же это значение выставить выше 2500 мс, тогда он перестает нормально работать и, скажем, при значении в 10 сек, read() может ожидать данных с устройства и 30 и 40 сек, а только потом возвращает полученный байт. Причем байт доступен в устройстве практически моментально. Не знаю чего он там ещё ждёт.
В чём может быть проблема?
Мне нужны таймауты до 120 с. Сейчас вместо tcsetattr() использую select(), но это костыль.
Код:
struct termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
};
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
};
c_cc это массив cc_t. а что такое cc_t? смотрим /usr/include/bits/termios.h
Код:
typedef unsigned char cc_t;
Таким образом, максимальное значение с_сс[VTIME] равно 255, и максимальный таймаут равен 255*0.1=25.5 сек, ибо в децисекундах он, т.е. в десятых долях секунды.
Ещё одно замечание. VTIME и VMIN учитываются только в неканоническом режиме. Так что лучше сразу сделать
Код:
cfmakeraw(&tconf)
А канонический режем отключен.
Если Вас беспокоит блокирование процесса на время выполнения чтения, то можно и в неблокирующем режиме читать.
Цитата:
А вы код покажите, что беспредметно разговаривать.
Цитата:
Если Вас беспокоит блокирование процесса на время выполнения чтения, то можно и в неблокирующем режиме читать.
нет, не в блокировке дело. просто мне нужно ожидать данных четко заданный промежеток времени.