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

 
 
> Опять UART, надоело городить самопальные протоколы
Tsvetik
сообщение Mar 14 2016, 11:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-06
Пользователь №: 21 663



Нужно передавать массивы двоичных данных по UART между двумя устройствами.

Так как полезная нагрузка не помещается в пределы 1 байта, необходимо поверх UART использовать некоторый логический протокол, который будет разделять фреймы и как-то управлять потоком.

Следовательно из 256 вариантов байта необходимо зарезервировать несколько значений для признаков начала (или конца) фрейма и, возможно, каких-то других управляющий символов.

Один из вариантов это /xon /xoff. Его минусы в том, что символы /xon /xoff могут встретиться в передаваемых двоичных данных и их надо экранировать. Плюс этого метода в том, что экранирование можно проводить "на лету" при приеме. Промежуточный буфер для этого не требуется.

Второй вариант использовать для кодирования двоичных данных некоторую кодировку. Например, BASE64 или семибитную кодировку, а старшие биты пристегивать отдельным байтом.
Тогда символы, не входящие в алфавит BASE64 или со взведенным старшим битом можно считать управляющими. На них можно повесить функции управления протоколом, начала-конца фрейма, повтора передачи, может-быть и адреса устройства и т.п. Обычно кодирование-декодирование требует промежуточного буфера и вносит дополнительные временные издержки.

Так вот, подскажите какие-нибудь популярные реализации логических протоколов поверх UART.
Необходимы легковесные протоколы, которые будут работать довольно быстро на Tiny AVR.

Да, желательно без 9-го бита UART, чтобы с PC было проще отлаживаться

Сообщение отредактировал Tsvetik - Mar 14 2016, 11:37
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение Mar 14 2016, 12:04
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Tsvetik @ Mar 14 2016, 13:08) *
Один из вариантов это /xon /xoff. Его минусы в том, что символы /xon /xoff могут встретиться в передаваемых двоичных данных и их надо экранировать.

Что вы называете "экранировать", не знаю, но для выделения уникального кода для управления применяется метод байт-стаффинга (byte stuffing).
Но отлаживаться с ним неудобно.

Обычно для простейших протоколов применяют разделение пакетов по тайм-аутам.
Самый простой и удобный метод.

А вообще для простеньких применений чаще всего применяют самопальные протоколы.
Правда, хороший самопальный протокол можно придумать только при достаточном опыте работы и предварительном написании кучи плохих самопальных протоколов sm.gif
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 12:20
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-06
Пользователь №: 21 663



Цитата(Baser @ Mar 14 2016, 15:04) *
Что вы называете "экранировать", не знаю, но для выделения уникального кода для управления применяется метод байт-стаффинга (byte stuffing).
Но отлаживаться с ним неудобно.

Обычно для простейших протоколов применяют разделение пакетов по тайм-аутам.
Самый простой и удобный метод.

А вообще для простеньких применений чаще всего применяют самопальные протоколы.
Правда, хороший самопальный протокол можно придумать только при достаточном опыте работы и предварительном написании кучи плохих самопальных протоколов sm.gif


Байт-стаффинг и есть экранировать иначе, escape sequence

Тайм-ауты нафиг. Медленно и не хочу зависимость от таймера.



Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 14 2016, 12:27
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Tsvetik @ Mar 14 2016, 14:20) *
Байт-стаффинг и есть экранировать иначе, escape sequence

Тайм-ауты нафиг. Медленно и не хочу зависимость от таймера.

Ну так типовая структура любого протокола (набор полей):
Стартовый байт
Поле адреса
Поле длины данных
Поле данных
Поле CRC

На все это накладываете байт-стаффинг для стартового байта.
Дальше просто вариации из вышеперечисленного.

Но 99% протоколов промышленного применения, что я видел, не применяют байт-стаффинг
и используют тайм-ауты sm.gif

Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 12:39
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-06
Пользователь №: 21 663



Цитата(Baser @ Mar 14 2016, 15:27) *
Ну так типовая структура любого протокола (набор полей):
Стартовый байт
Поле адреса
Поле длины данных
Поле данных
Поле CRC

На все это накладываете байт-стаффинг для стартового байта.
Дальше просто вариации из вышеперечисленного.

Но 99% протоколов промышленного применения, что я видел, не применяют байт-стаффинг
и используют тайм-ауты sm.gif


Да вот что-то не нравится мне эта схема вот чем:
Длина идет не первым байтом. Если МК с DMA, то нужно будет несколько входов в обработчик прежде чем можно будет включить DMA.

Все, что здесь предлагали это какой-то самопал.
Неужели нет чего-то более-менее стандартног-популярного? Может, рекомендованного IEC или еще каким-то международным институтом?

Сообщение отредактировал Tsvetik - Mar 14 2016, 12:43
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 15 2016, 13:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Tsvetik @ Mar 14 2016, 18:39) *
Длина идет не первым байтом. Если МК с DMA, то нужно будет несколько входов в обработчик прежде чем можно будет включить DMA.

Не смешивайте уровни обработки. Драйвер DMA не должен никак зависеть от протокола в котором передаётся поток. Он вообще ничего не должен знать о протоколе.
Программируете DMA на любой удобный размер, запускаете и дополнительно, по таймеру отслеживаете состояние работы DMA, с принудительным завершением и перезапуском при простое принимаемого потока.

Цитата(iosifk @ Mar 15 2016, 19:02) *
См. посто №1: "Необходимы легковесные протоколы, которые будут работать довольно быстро на Tiny AVR."
sm.gif

Ну понятно. Это просто вспомнилось. К месту или не к месту laughing.gif
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 15 2016, 17:34
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-10-06
Пользователь №: 21 663



Цитата(jcxz @ Mar 15 2016, 16:05) *
Не смешивайте уровни обработки. Драйвер DMA не должен никак зависеть от протокола в котором передаётся поток. Он вообще ничего не должен знать о протоколе.
Программируете DMA на любой удобный размер, запускаете и дополнительно, по таймеру отслеживаете состояние работы DMA, с принудительным завершением и перезапуском при простое принимаемого потока.


Ну понятно. Это просто вспомнилось. К месту или не к месту laughing.gif


Ну, с одной стороны tiny, а с другой ARM7 или PC при тестах и отладке. Так что требование к DMA вторично.

С одной стороны, когда DMA не знает ничего о протоколе будет легко разделить передачу на различные уровни обработки. С другой стороны, добавление уровней обработки часто означает добавление дополнительных буфферов и сильного увеличения уровня вложенности функций.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 16 2016, 06:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Tsvetik @ Mar 15 2016, 23:34) *
С одной стороны, когда DMA не знает ничего о протоколе будет легко разделить передачу на различные уровни обработки. С другой стороны, добавление уровней обработки часто означает добавление дополнительных буфферов и сильного увеличения уровня вложенности функций.

Не понял - о чём Вы? Сколько каких уровней?
Вам же вроде надо только выделять кадры из потока байт (определять границы кадра в потоке байт)?
Тут хоть с DMA хоть без (на прерываниях) будет только два процесса: 1-ый пишущий в кольцевой буфер байт; 2-ой - читающий из кольцевого буфера поток байт и разбирающий его на кадры. Всё.
Если в этих кадрах у Вас инкапсулирован другой протокол - тогда да - дальше будет уровень парсинга уже его кадров из полученных ранее кадров протокола 1-го уровня. Но у Вас вроде только один протокол без вложенных.

Если драйвер UART реализован без DMA: ISR UART пишет принимаемые байты в кольцевой буфер и пингует задачу, читающую этот буфер и парсящую поток байт на кадры.
Если с DMA - то же самое: DMA пишет в тот же самый буфер и ISR завершения DMA-транзакции так же пингует задачу парсера. Единственно, что наверное записываемые группы байт будут больше, чем в варианте драйвера по прерываниям.
В остальном - никакой разницы. Парсер протокола никак не должен зависеть от реализации драйвера UART и каким образом тот кладёт байты в кольцевой буфер.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Tsvetik   Опять UART   Mar 14 2016, 11:08
- - Александр1   Цитата(Tsvetik @ Mar 14 2016, 15:08) ... ...   Mar 14 2016, 11:22
|- - Tsvetik   Цитата(Александр1 @ Mar 14 2016, 14:22) Н...   Mar 14 2016, 11:32
- - iosifk   Цитата(Tsvetik @ Mar 14 2016, 14:08) Нужн...   Mar 14 2016, 11:38
|- - Tsvetik   За WAKE спасибо.   Mar 14 2016, 11:58
||- - iosifk   Цитата(Tsvetik @ Mar 14 2016, 14:58) А эт...   Mar 14 2016, 12:03
|- - zltigo   QUOTE (iosifk @ Mar 14 2016, 13:38) Медле...   Mar 14 2016, 12:46
||- - Tsvetik   Цитата(zltigo @ Mar 14 2016, 15:46) Могу ...   Mar 14 2016, 12:52
|- - jcxz   Цитата(iosifk @ Mar 14 2016, 17:38) Делат...   Mar 15 2016, 12:59
|- - zltigo   QUOTE (jcxz @ Mar 15 2016, 14:54) Сделал ...   Mar 15 2016, 12:59
|- - iosifk   Цитата(jcxz @ Mar 15 2016, 15:59) Это смо...   Mar 15 2016, 13:02
||- - zltigo   QUOTE (Baser @ Mar 14 2016, 14:27) Но 99%...   Mar 14 2016, 12:38
|||- - Baser   Цитата(zltigo @ Mar 14 2016, 14:38) Людое...   Mar 14 2016, 12:49
|||- - zltigo   QUOTE (Baser @ Mar 14 2016, 14:49) Я вот ...   Mar 14 2016, 13:11
|||- - Corvus   Цитата(zltigo @ Mar 14 2016, 16:11) Глупо...   Mar 14 2016, 13:33
||||- - Ruslan1   разделение на фреймы: SLIP (RFC1055) https://tools...   Mar 14 2016, 13:56
|||- - Огурцов   Цитата(zltigo @ Mar 14 2016, 14:11) Адрес...   Mar 15 2016, 16:23
|||- - zltigo   QUOTE (Огурцов @ Mar 15 2016, 18:23) заче...   Mar 15 2016, 16:31
||- - Ruslan1   У меня в одном устройстве используется по приему к...   Mar 16 2016, 07:43
|- - iosifk   Цитата(Tsvetik @ Mar 14 2016, 15:20) Байт...   Mar 14 2016, 13:30
- - Kaligooola   В 8b/10b кодировании есть признаки старта / стопа ...   Mar 14 2016, 12:16
- - Baser   Цитата(zltigo @ Mar 14 2016, 15:11) Ни то...   Mar 14 2016, 13:58
|- - zltigo   QUOTE (Baser @ Mar 14 2016, 15:58) Тут я ...   Mar 14 2016, 14:17
- - mempfis_   Цитата(Tsvetik @ Mar 14 2016, 15:08) Так ...   Mar 15 2016, 14:05
- - sigmaN   ЦитатаС одной стороны, когда DMA не знает ничего о...   Mar 15 2016, 20:05
- - =AK=   Цитата(Tsvetik @ Mar 14 2016, 21:38) След...   Mar 17 2016, 05:26
- - Tsvetik   Цитата(=AK= @ Mar 17 2016, 08:26) Если ма...   Mar 17 2016, 06:35
- - AlexandrY   Цитата(Tsvetik @ Mar 17 2016, 08:35) COBS...   Mar 17 2016, 07:30
- - Tsvetik   Цитата(AlexandrY @ Mar 17 2016, 10:30) Од...   Mar 17 2016, 07:31
- - zltigo   QUOTE (AlexandrY @ Mar 17 2016, 09:30) Од...   Mar 17 2016, 07:47


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:31
Рейтинг@Mail.ru


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