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

 
 
 
Reply to this topicStart new topic
> Обработка ошибок приема данных по последовательному порту
_3m
сообщение Nov 17 2011, 14:05
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Возникла проблемка с последовательным портом в линукс.
Не могу найти описание как организовать проверку ошибок принимаемых данных, таких как TTY_BREAK, TTY_FRAME, TTY_PARITY и TTY_OVERRUN.
Изучение исходников драйвера tty/serial показало что в буфере драйвера имеется два массива - один для принятых данных, второй для флагов, т.е. драйвер хранит внутри пару байт+флаг, кроме того в драйвере имеются счетчики ошибок. Вся эта информация мне необходима в приложении для корректной обработки сбоев протокола связи а как ее получить - никакой вразумительной информации не нашел, гугл выдает слишком много мусора.
Данные бинарные.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Nov 18 2011, 14:08
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(_3m @ Nov 17 2011, 18:05) *
никакой вразумительной информации не нашел, гугл выдает слишком много мусора.


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

$ man 3 termios
Go to the top of the page
 
+Quote Post
_3m
сообщение Nov 18 2011, 15:37
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



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

man termios зачитан до дыр. ответов на интересующие вопросы не найдено.
Для начала простейшая задача:
После открытия порта необходимо определить не находится ли RXD в состоянии break. Если break - ожидать прекращаение break. Состояние Break может быть непрерывным. Физически требуется мониторить один бит из регистра статуса UART.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Nov 18 2011, 17:50
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(_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.
Go to the top of the page
 
+Quote Post
_3m
сообщение Nov 24 2011, 06:25
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(sasamy @ Nov 18 2011, 21:50) *
Ответ на то что вы описали находится буквально в первых строчках мана...

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

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

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

Подробности про BREAK:
Статический BREAK детектировать невозможно в принципе.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Nov 24 2011, 07:27
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



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


Это защита "от дурака" и в данном случае она отлично сработала sm.gif

Сообщение отредактировал sasamy - Nov 24 2011, 07:39
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:44
Рейтинг@Mail.ru


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