Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Таймаут при чтении из серийного порта. 
:(
    Опции темы
xStream
Дата 12.2.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.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(), но это костыль. 

PM MAIL   Вверх
bilbobagginz
Дата 12.2.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



там есть 2 "локальных" режима:
"канонический", устанвливается:
Код

tconf.c_lflag |= (ICANON);

"неканонический":
Код

tconf.c_lflag &= (~ICANON);

функционал VTIME в каждом режиме свой.
перечитай очень внимательно мануальчик по termios.



Это сообщение отредактировал(а) bilbobagginz - 12.2.2010, 16:25


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
xStream
Дата 12.2.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



Цитата(bilbobagginz @ 12.2.2010,  16:22)
там есть 2 "локальных" режима:
"канонический", устанвливается:
Код

tconf.c_lflag |=ICANON;

"неканонический":
Код

tconf.c_lflag ^= tconf.c_lflag;

функционал VTIME в каждом режиме свой.

перечитай очень внимательно мануальчик по termios.

Канонический режим у меня отключен. man tcsetattr перечитал 10 раз. В каноническом режиме таймаут вообще не работает.
PM MAIL   Вверх
bilbobagginz
Дата 12.2.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



xStream
a что сидит на другом конце последовательного порта?

Добавлено через 2 минуты и 37 секунд
может тот, кто сидит на др. конце - вырубается сам.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
xStream
Дата 12.2.2010, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



bilbobagginz
Фискальный регистратор.
На вряд ли. С select оно работает smile

PM MAIL   Вверх
bilbobagginz
Дата 12.2.2010, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



а можешь показать что получаешь:
Код

if (tcsetattr(fd, TCSANOW, &tconf)){
   perror("skotinka: ");
}

?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
xStream
Дата 12.2.2010, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



bilbobagginz,  tcsetattr возвращает 0
PM MAIL   Вверх
bilbobagginz
Дата 12.2.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



все равно собака....  smile
А если устройство работает быстро, почему таймаут в 2.5 секунды - не подходит?

Добавлено @ 17:22
и еще момент, там есть еще каунтер байтов:
Код

term.c_cc[VMIN]

ты его трогал ?
там есть схема условий, когда read  возвращается, 4 случая (когда VMIN/VTIME по нулям)

и еще вопрос: почему асинхронный подход тебе не нравится?


Это сообщение отредактировал(а) bilbobagginz - 12.2.2010, 17:25


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
xStream
Дата 12.2.2010, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



Цитата(bilbobagginz @ 12.2.2010,  17:18)
все равно собака....  smile
А если устройство работает быстро, почему таймаут в 2.5 секунды - не подходит?

Добавлено @ 17:22
и еще момент, там есть еще каунтер байтов:
Код

term.c_cc[VMIN]

ты его трогал ?
там есть схема условий, когда read  возвращается, 4 случая (когда VMIN/VTIME по нулям)

и еще вопрос: почему асинхронный подход тебе не нравится?

Ожидать байт надо столько, сколько прописано в документации к устройству. И это время может колебаться от 500 мс, до 150000 мс. 
.c_cc[VMIN] выставлен в 0.
PM MAIL   Вверх
bilbobagginz
Дата 12.2.2010, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



Цитата(xStream @  12.2.2010,  16:28 Найти цитируемый пост)
Ожидать байт

т.е. 1 байт ожидаешь ?

Добавлено через 12 минут и 37 секунд
и еще вопросик: когда read() возвращается позже чем надо, он какую ошибку возвращает, какой errno ?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
xStream
Дата 15.2.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



Цитата(bilbobagginz @ 12.2.2010,  17:43)
т.е. 1 байт ожидаешь ?

и еще вопросик: когда read() возвращается позже чем надо, он какую ошибку возвращает, какой errno ?

да, по 1-му байту считываю

а read() возвращается без ошибки и с 1 прочитанным байтом (как и надо), даже если позже таймаута. но устройство, то уже потеряло логическую нить. оно считает, что комп не ответил в нужный промежуток времени и начинает "диалог" заново. 

PM MAIL   Вверх
kuzulis
Дата 15.2.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



ИМХО, select в помощь + все VMIN и VTIME по нулям + при открытии флагами ставить асинхронный режим + читать не по 1 байту - а по реальному их количеству в приемном буфере и потом просто проверять скока прочиталось и скока нужно еще дочитать и т.п. Всё просто.

Вопрос: нужно именно под *.nix или тебе можно и кроссплатформенное решение на Qt4 ? smile

Добавлено через 1 минуту и 57 секунд
И еще, какой протокол работы с устройством?

Добавлено через 4 минуты и 30 секунд
Цитата

Мне нужны таймауты до 120 с. Сейчас вместо tcsetattr() использую select(), но это костыль. 


Ну неправда... Это не костыль! smile
PM MAIL   Вверх
xStream
Дата 15.2.2010, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



Цитата

ИМХО, select в помощь + все VMIN и VTIME по нулям + при открытии флагами ставить асинхронный режим + читать не по 1 байту - а по реальному их количеству в приемном буфере и потом просто проверять скока прочиталось и скока нужно еще дочитать и т.п. Всё просто.

Примерно так всё сейчас и работает.

Цитата

Вопрос: нужно именно под *.nix или тебе можно и кроссплатформенное решение на Qt4 ? smile

Не можно, а нужно. Использую QextSerialPort

Цитата

И еще, какой протокол работы с устройством?

АТОЛ Протокол работы ККМ.

PM MAIL   Вверх
kuzulis
Дата 15.2.2010, 18:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

Не можно, а нужно. Использую QextSerialPort


а попробуйте ка  QSerialDevice. http://fireforge.net/snapshots.php?group_id=199

PS: мне нужны тестеры сего поделия smile

Добавлено через 45 секунд
Цитата

Примерно так всё сейчас и работает.


ИМХО - тогда и нечего заморачиваться
PM MAIL   Вверх
xStream
Дата 16.2.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.5.2005

Репутация: нет
Всего: нет



kuzulis, отписался тебе в личку. 

Цитата

ИМХО - тогда и нечего заморачиваться


приходится. с select тоже не все гладко.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.