реклама на сайте
подробности

 
 
> последовательный порт, таймаут на прием
Reuk
сообщение Jan 31 2011, 08:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 8-04-10
Из: Иркутск
Пользователь №: 56 503



Здравствуйте все!
Начал тут отлаживать обмен своей железяки путем написания консоли. обмен на скорости 600 бод пакетами до 20 байт. пауза между пакетами (запрос - ответ) не более 100 мс.
Принимаю так:
- в цикле пытаюсь считать по одному байту (в заголовке есть длинна пакета)
- как только набрался пакет - разбираю его в (switch по заголовку) и генерю ответ.

Проблема в следующем: подряд принимаются первые 7-8 байт (вместе с заголовком). потом следуют пустые запросы - нет данных на прием (около 100 мс). потом сваливается вторая половина пакета подряд. данные в шине идут без этого разрыва (смотрел осцилографом). соответстенно не успеваю ответить в положенные 100 мс.

Пробовал принимать так:
- в цикле принимаю по одному байту заголовок и длинну, потом пытаюсь считать данные одним блоком ReadFile, задав ожидаемое число байт в параметрах. Соответственно задаю параметры структуры COMMTIMEOUTS.
При любых значених поля ReadIntervalTimeout меньше 100 (кроме 0 соответственно) ReadFile вылетает по таймауту и возвращает, что считала те же 6 байт из нужных, например 14. при значениях 0 и более 100 она таки дожидается весь пакет.

Теперь вопрос: откуда такая конская задержка вылазит и как от нее избавиться?)

Сообщение отредактировал Reuk - Jan 31 2011, 08:07
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
V_G
сообщение Jan 31 2011, 08:47
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Эмулировать на Винде железяку с жестким таймаутом 100 мс - последнее дело, все-таки Винда - не ОС реального времени. Попробуйте не использовать таймауты.
Я для приложений с интенсивным обменом по компорту просто резервирую побольше приемный буфер, а по WaitCommEvent по приему байта уже считываю и разбираю весь буфер.
И приемную часть программы организую отдельным процессом (thread) с высоким приоритетом. А уже полученные и обработанные данные пересылаю в основной процесс через PostMessage.

Регулировать приоритет - через SetThreadPriority

Сообщение отредактировал V_G - Jan 31 2011, 08:49
Go to the top of the page
 
+Quote Post
Reuk
сообщение Jan 31 2011, 08:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 8-04-10
Из: Иркутск
Пользователь №: 56 503



Цитата(V_G @ Jan 31 2011, 16:47) *
Я для приложений с интенсивным обменом по компорту просто резервирую побольше приемный буфер, а по WaitCommEvent по приему байта.


по событию EV_RXCHAR? попробую щас так и сделать)
спасибо. я вот тоже тут в раздумьях - винда же вроде потоки переключает как раз с интервалом в десятки мс....
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 11:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016