LINUX.ORG.RU

Последоватьльный порт - таймаут read'a в raw режиме.


0

0

Есть АЦП, подключаемый к последовательному порту. Работает в режиме "запрос-ответ". Такие траблы:

Часто (~ в 80'ти процентах случаев) АЦП откликается со второго раза, т.е. с первая попытка закончилась вылетом read'а по таймауту. Что самое интересное, когда тот же самый АЦП (и с той-же линией связи) опрашивает контроллер (AVR) без всякой оси, то в 99.99 процентах случаев получается отклик с первого раза, с меньшим таймаутом.

Считываю не посимвольно, а сразу весь ответ АЦП (read на10 символов), поставил timeout в 0.1 с (VMIN = 1), что нормально для данного АЦП, VMIN поставил равным нулю, т.к. я понял, покурив Serial Programming Guide for POSIX Operating Systems и другие man'ы, что timeout на время блокировки read'а из /dev/ttyS* можно задать только в raw mode. Кроме того, если и VTIME и VMIN больше нуля, то ядро разблокирует read только после получения VMIN символов, если получен хотя-бы один за время VTIME. Т.е. задавать и VMIN и VTIME не имеет смысла - в случаи разрыва связи read будет заблокирован навечно.

Может у кого были аналогичные проблемы - куда копать?

Аналогичных проблем не было, н я бы порылся в настройках порта.

Кстати, зачем тебе тайм-аут вообще? Почему не poll?

tailgunner ★★★★★
()
Ответ на: комментарий от marsijanin

> select/poll должен спасти отца марсиянской паранойи от гнева начальства?

Нет, тебя всё равно расстреляют^Wлишат премии. Но зато у тебя не будет бесконечных тайм-аутов :)

tailgunner ★★★★★
()

Когда-то давно писал опрос электросчетчиков через преобразователь usb<->485 но смысл тот же - последовательный порт, была аналогичная проблема, помоему решилась посимвольный чтением - там по протоколу первый байт был - длина ответа счетчика - поэтому после чтения первого байта было известно количество байт которые нужно считать. Если ты знаешь сколька нужно прочитать - читай посимвольно в цикле.

anonymous
()
Ответ на: комментарий от anonymous

Уже была такая идея - посимвольно читать. Вот только не жирно ли будет, в том плане, что тянуть ответ целиком проще, чем каждый раз дёргать устройство read'ом из-за каждого символа?

marsijanin ★★
() автор топика
Ответ на: комментарий от anonymous

> по протоколу первый байт был - длина ответа счетчика - поэтому после чтения первого байта было известно количество байт которые нужно считать. Если ты знаешь сколька нужно прочитать - читай посимвольно в цикле.

Если работа с железом меня чему-то и научила, то одной вещи - пиши программу так, будто злобное устройство изо всех сил пытается ее сломать. Поэтому тайм-ауты - это наше ффсио.

tailgunner ★★★★★
()
Ответ на: комментарий от marsijanin

> не жирно ли будет, в том плане, что тянуть ответ целиком проще, чем каждый раз дёргать устройство read'ом из-за каждого символа?

Бггг. Какая скорость порта? Какой проц?

tailgunner ★★★★★
()
Ответ на: комментарий от marsijanin

Впрочем, это, похоже, "паранойя жить спокойно не даёт"

marsijanin ★★
() автор топика
Ответ на: комментарий от tailgunner

Именно так я делал и делаю :) Там же контрольная сумма есть и к тому же в конфиге задавалось максимальное количество неудачных попыток.

anonymous
()
Ответ на: комментарий от marsijanin

> Ну пока гоняю на 9600, то, естественно, всё равно.

О чем и спич.

> Но там режимы вплоть до 115200.

Ставь non-blocking режим, и читай блоками. FIFO тебе поможет.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Если работа с железом меня чему-то и научила, то одной вещи - пиши программу так, будто злобное устройство изо всех сил пытается ее сломать. Поэтому тайм-ауты - это наше ффсио.

+много Или во время приёма кто-то отрубил питание девайсу, случайно задел RS'овский кабель...

marsijanin ★★
() автор топика
Ответ на: комментарий от tailgunner

ОК - спасибо, попробую. Со 115200 я немного погорячился - это уже не "вопрос-ответ", а непрерывный режим.

marsijanin ★★
() автор топика
Ответ на: комментарий от marsijanin

Читай блоками - когда надоест получать ошибки поумнеешь :) Удивляюсь такой настойчивости - ни чужие ни свои ошибки не учат :) При посимвольном чтении таймауты никто же не отменял. А вообще чета интересно стало - что за ацп такой - передает данные судя по 10 байтам ответа - высокой разрядности и без контролной суммы по очень ненадежному интерфейсу ?

anonymous
()

>VTIME и VMIN

выставь обеих в 0, включи неблокирующий режим и рули select-om.

\\wbr cvv

cvv ★★★★★
()

Ошибка однозначно в параметрах открытия порта,
там есть много настроек
всякие биты четности, аппаратное/программное управление и т.д.
поиграй с этими параметрами.

anonymous
()
Ответ на: комментарий от cvv

Уже сделал. А если бы ещё девайс не отключили (чего через ssh не видно) , то и, может увидел бы, не только как этот select timeout отрабатывает.

marsijanin ★★
() автор топика
Ответ на: комментарий от marsijanin

а я poll'ом жду события от посл порта в отд потоке, который запуская из main при этом прога или зависает или графика глючит а чаще вообще всё вылетает... хотя под bash всё работает нормально..

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.