Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Таймаут при чтении из серийного порта

12K
12 февраля 2010 года
xSt
6 / / 14.09.2005
Всем привет. Помогите, пожалуйста, разобраться с таймаутами при работе с серийным портом (/dev/ttyS0).
Устанавливаю я него примерно так:
 
Код:
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(), но это костыль.
43K
13 февраля 2010 года
loki231
76 / / 27.09.2009
Смотрим определение struct termios.

Код:
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
  };


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)
и перевести терминал в raw-mode. Заодно и всякие преобразования типа cr->[cr,lf], эхи и т.д . мешаться не будут.
12K
15 февраля 2010 года
xSt
6 / / 14.09.2005
Да, это я понимаю, что таймаут 120 сек я от него не добьюсь, но проблему с 10-ю секундами это не решит. Все равно read() будет ждать больше положенного.
А канонический режем отключен.
43K
15 февраля 2010 года
loki231
76 / / 27.09.2009
А вы код покажите, что беспредметно разговаривать.

Если Вас беспокоит блокирование процесса на время выполнения чтения, то можно и в неблокирующем режиме читать.
12K
15 февраля 2010 года
xSt
6 / / 14.09.2005
Цитата:
А вы код покажите, что беспредметно разговаривать.


http://qextserialport.cvs.sourceforge.net/viewvc/qextserialport/qextserialport/posix_qextserialport.cpp?revision=1.19&view=markup

Цитата:
Если Вас беспокоит блокирование процесса на время выполнения чтения, то можно и в неблокирующем режиме читать.


нет, не в блокировке дело. просто мне нужно ожидать данных четко заданный промежеток времени.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог