Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка ошибок приема данных по последовательному порту
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
_3m
Возникла проблемка с последовательным портом в линукс.
Не могу найти описание как организовать проверку ошибок принимаемых данных, таких как TTY_BREAK, TTY_FRAME, TTY_PARITY и TTY_OVERRUN.
Изучение исходников драйвера tty/serial показало что в буфере драйвера имеется два массива - один для принятых данных, второй для флагов, т.е. драйвер хранит внутри пару байт+флаг, кроме того в драйвере имеются счетчики ошибок. Вся эта информация мне необходима в приложении для корректной обработки сбоев протокола связи а как ее получить - никакой вразумительной информации не нашел, гугл выдает слишком много мусора.
Данные бинарные.
sasamy
Цитата(_3m @ Nov 17 2011, 18:05) *
никакой вразумительной информации не нашел, гугл выдает слишком много мусора.


В консоли набрать:

$ man 3 termios
_3m
Цитата(sasamy @ Nov 18 2011, 17:08) *
В консоли набрать:
$ man 3 termios

man termios зачитан до дыр. ответов на интересующие вопросы не найдено.
Для начала простейшая задача:
После открытия порта необходимо определить не находится ли RXD в состоянии break. Если break - ожидать прекращаение break. Состояние Break может быть непрерывным. Физически требуется мониторить один бит из регистра статуса UART.
sasamy
Цитата(_3m @ Nov 18 2011, 19:37) *
Не могу найти описание как организовать проверку ошибок принимаемых данных, таких как TTY_BREAK, TTY_FRAME, TTY_PARITY и TTY_OVERRUN.
......
man termios зачитан до дыр. ответов на интересующие вопросы не найдено.


Ответ на то что вы описали находится буквально в первых строчках мана
Цитата
IGNBRK Ignore BREAK condition on input.

BRKINT If IGNBRK is set, a BREAK is ignored. If it is not set but BRKINT is set, then a BREAK causes the
input and output queues to be flushed, and if the terminal is the controlling terminal of a foreground
process group, it will cause a SIGINT to be sent to this foreground process group. When neither IGNBRK
nor BRKINT are set, a BREAK reads as a null byte ('\0'), except when PARMRK is set, in which case it
reads as the sequence \377 \0 \0.

IGNPAR Ignore framing errors and parity errors.

PARMRK If IGNPAR is not set, prefix a character with a parity error or framing error with \377 \0. If neither
IGNPAR nor PARMRK is set, read a character with a parity error or framing error as \0.



Цитата
После открытия порта необходимо определить не находится ли RXD в состоянии break. Если break - ожидать прекращаение break. Состояние Break может быть непрерывным. Физически требуется мониторить один бит из регистра статуса UART.


Мониторинг регистров - это для ногодрыгательной ОС, в нормальных ОС этим занимаются драйверы, в Linux можно кроме этого сделать
1 mmap регистров контроллера в юзерспейс (man mem, man mmap)
2 использовать UIO.
_3m
Цитата(sasamy @ Nov 18 2011, 21:50) *
Ответ на то что вы описали находится буквально в первых строчках мана...

Вы тем что в мане написано пользоваться пробовали ? Очевидно что НЕТ потому что иначе написали бы несколько другое.
Итог:
Для осмысленной реакции на ошибки необходимо писать свою Line discipline. В стандартных все обрезано по самые гланды.

Цитата
Мониторинг регистров - это для ногодрыгательной ОС, в нормальных ОС этим занимаются драйверы, в Linux можно кроме этого сделать
1 mmap регистров контроллера в юзерспейс (man mem, man mmap)
2 использовать UIO.

Стоящая прикладная ЗАДАЧА всегда первична и необсуждаема, ее нужно решать независимо от ее совместимости или несовместимости с идеологией линукс.
Да, linux-way это когда в юзерспейсе невозможно сделать что либо нестандартное и на любой чих нужно править ядро. Увы sad.gif
mmap непортируемо.

Подробности про BREAK:
Статический BREAK детектировать невозможно в принципе.
sasamy
Цитата(_3m @ Nov 24 2011, 10:25) *
Да, linux-way это когда в юзерспейсе невозможно сделать что либо нестандартное и на любой чих нужно править ядро.


Это защита "от дурака" и в данном случае она отлично сработала sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.