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

Событие, аналогичное флагу TX_EMPTY

Добрый день.
Есть некий tty (UART). Есть процесс, который в него пишет и читает из него. Читать нужно по тайм-ауту после физического окончания передачи, количество передаваемых байт переменное. Очень не хочется отдавать всё на откуп микросекундным задержкам, хотелось бы ждать сигнала от передатчика, что последний стоповый бит передан в канал (ну, в крайнем случае, - положили последний байт в сдвиговый регистр)
Как правильно это сделать?

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


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

У UART'ов обычно помимо флага прерывания TxEmpty есть флаг TxComplete, который взводится, когда последний бит данных покинул сдвиговый регистр передатчика. Он и означает физическое окончание передачи. Обычно используется в полудуплексных системах, чтобы перевести выход передатчика по окончании в высокоимпедансное состояние. Может быть это вам поможет.

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


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

В 13.04.2020 в 10:52, toweroff сказал:

Как правильно это сделать?

По-моему, правильно читать не по тайм-ауту после окончания передачи, а всё время, непрерывно. Поток на запись, поток на чтение. И (опционально) - синхронизацию, которая уведомляет принимающий поток, что пошла новая команда.

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


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

4 часа назад, dxp сказал:

У UART'ов обычно помимо флага прерывания TxEmpty есть флаг TxComplete, который взводится, когда последний бит данных покинул сдвиговый регистр передатчика.

Вы заблуждаетесь!

В soc заточенных на linux часто применяют 16550 compatible uart. В большинстве реализаций 16550 прерывание по TxEmpty не предусмотрено. Обычно есть флаг  TxEmpty без прерывания но в некторых чипах "альтерннативно одаренные" HDL дизайнеры и его не реализуют. И остается только TX Fifo empty. Вот с этим как хочешь так и крутись.

Пример https://github.com/Axl-zhang/Allwinner-V40-T3-R40-manual/blob/master/V40_R40_T3_Datasheet_V1.2.pdf

Раздел 9.3, стр 632.

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


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

On 4/13/2020 at 8:52 AM, toweroff said:

Как правильно это сделать?

Какой процессор ? Обычно, если возможно, в драйверах реализуют  полудуплекс для rs485

https://elixir.bootlin.com/linux/latest/ident/serial_rs485

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


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

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

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

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

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

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

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

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

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

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