Jump to content

    
Sign in to follow this  
toweroff

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
В 13.04.2020 в 10:52, toweroff сказал:

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
On 4/13/2020 at 8:52 AM, toweroff said:

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this