Перейти к содержанию
    

Обработка ошибок приема данных по последовательному порту

Возникла проблемка с последовательным портом в линукс.

Не могу найти описание как организовать проверку ошибок принимаемых данных, таких как TTY_BREAK, TTY_FRAME, TTY_PARITY и TTY_OVERRUN.

Изучение исходников драйвера tty/serial показало что в буфере драйвера имеется два массива - один для принятых данных, второй для флагов, т.е. драйвер хранит внутри пару байт+флаг, кроме того в драйвере имеются счетчики ошибок. Вся эта информация мне необходима в приложении для корректной обработки сбоев протокола связи а как ее получить - никакой вразумительной информации не нашел, гугл выдает слишком много мусора.

Данные бинарные.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

никакой вразумительной информации не нашел, гугл выдает слишком много мусора.

 

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

 

$ man 3 termios

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

$ man 3 termios

man termios зачитан до дыр. ответов на интересующие вопросы не найдено.

Для начала простейшая задача:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу найти описание как организовать проверку ошибок принимаемых данных, таких как 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ответ на то что вы описали находится буквально в первых строчках мана...

Вы тем что в мане написано пользоваться пробовали ? Очевидно что НЕТ потому что иначе написали бы несколько другое.

Итог:

Для осмысленной реакции на ошибки необходимо писать свою Line discipline. В стандартных все обрезано по самые гланды.

 

Мониторинг регистров - это для ногодрыгательной ОС, в нормальных ОС этим занимаются драйверы, в Linux можно кроме этого сделать

1 mmap регистров контроллера в юзерспейс (man mem, man mmap)

2 использовать UIO.

Стоящая прикладная ЗАДАЧА всегда первична и необсуждаема, ее нужно решать независимо от ее совместимости или несовместимости с идеологией линукс.

Да, linux-way это когда в юзерспейсе невозможно сделать что либо нестандартное и на любой чих нужно править ядро. Увы :(

mmap непортируемо.

 

Подробности про BREAK:

Статический BREAK детектировать невозможно в принципе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, linux-way это когда в юзерспейсе невозможно сделать что либо нестандартное и на любой чих нужно править ядро.

 

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

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...