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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Опять 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
Александр1
сообщение Mar 14 2016, 11:22
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 465
Регистрация: 13-05-15
Из: Запорожье
Пользователь №: 86 663



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

Например, начало/конец сообщения обозначить 2-3 символами. И только эта последовательность будет началом/окончанием сообщения. Все символы, входящие в эти последовательности, по отдельности или в другом порядке - есть данные.
Управление АТ-командами - вот пример. Начало всегда АТ, а окончание LF, CR.
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 11:32
Сообщение #3


Участник
*

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



Цитата(Александр1 @ Mar 14 2016, 14:22) *
Например, начало/конец сообщения обозначить 2-3 символами. И только эта последовательность будет началом/окончанием сообщения. Все символы, входящие в эти последовательности, по отдельности или в другом порядке - есть данные.
Управление АТ-командами - вот пример. Начало всегда АТ, а окончание LF, CR.


Те же N символов могут встретиться и в двоичных данных.
Например, надо передать AT команду в которой содержится другая AT команда biggrin.gif

Сообщение отредактировал Tsvetik - Mar 14 2016, 11:34
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 14 2016, 11:38
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Tsvetik @ Mar 14 2016, 14:08) *
Нужно передавать массивы двоичных данных по UART между двумя устройствами.

....

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

Стандартно либо передаете данные символьными кодами. А возврат каретки и перевод строки - это конец сообщения. Медленно, т.к. один байт передается двумя посылками, но просто... И годится любая терминалка на хосте...
Либо байт-стаффинг. Например WAKE от Ридико... Исходники и описания Леонид выложил...
Делать бит-стаффинг нет смысла, т.к. сдвигать массив данных на микроконтроллере долго...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 11:58
Сообщение #5


Участник
*

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



За WAKE спасибо.



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


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Tsvetik @ Mar 14 2016, 14:58) *
А это где посмотреть?

Wake + Ридико Леонид Иванович + любой поисковик


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 14 2016, 12:04
Сообщение #7


Просто 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
Kaligooola
сообщение Mar 14 2016, 12:16
Сообщение #8


Brubel
***

Группа: Свой
Сообщений: 321
Регистрация: 17-11-06
Из: Oudergem
Пользователь №: 22 444



В 8b/10b кодировании есть признаки старта / стопа сообщения и синхронизирующие сообщения. Там это сделано для того чтоб подстраивать PLL для извлечения синхросигнала из данных, и получаем сигнал из неповторяющихся длинных последовательностей из "1" или "0".
Но этот принцип можно использовать для выбора протокола и по UART.
За счёт избытоного кодирования, все вариации восьмибитных данных закладываются внутрь 10 битных посылок. У нас появляются никогда не встречаюся комбинации, в них и вкладываются служебные признаки.
Удобно ли конкретно этот протокол, вкладывать в скорости UART - не пробовал, всё таки разработан он немного для других вещей.
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 12:20
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #10


Просто 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
zltigo
сообщение Mar 14 2016, 12:38
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Baser @ Mar 14 2016, 14:27) *
Но 99% протоколов промышленного применения, что я видел, не применяют байт-стаффинг
и используют тайм-ауты sm.gif

Людоеды племени умба-юмба не используют не только таймауты, но и вообще промышленные применения. Темные люди sad.gif, как и 99% "промышленных автоматизаторов" sad.gif sad.gif sad.gif.
Ну а таймауты нужны В ЛЮБОМ случае. При том-же байтстаффинге для отработки ошибок использовать таймаут, как аварийное завершение фрейма и по нему-же выброс мусора.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 12:39
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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
zltigo
сообщение Mar 14 2016, 12:46
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (iosifk @ Mar 14 2016, 13:38) *
Медленно, т.к. один байт передается двумя посылками

Сивольные это не обязательно HEX. Можно так-же легко и 3 байта четырьмя символами в стиле UUE, или еще более плотно упаковать.


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

Могу Вас огорчить до "первого байта" Вы с удручающей вероятностью В РЕАЛЬНОЙ ЖИЗНИ сначала отгребете еще мусора. Так что забудьте о том, что есть какой то "первый байт".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 14 2016, 12:49
Сообщение #14


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

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



Цитата(zltigo @ Mar 14 2016, 14:38) *
Людоеды племени умба-юмба не используют не только таймауты, но и вообще промышленные применения. Темные люди sad.gif, как и 99% "промышленных автоматизаторов" sad.gif sad.gif sad.gif.

Любите вы, zltigo, туману подпустить в витиеватой форме.
Я вот даже не понял, то ли мне улыбаться надо, то ли обижаться biggrin.gif

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

Я не имел ввиду жесткий порядок полей.
Встречал всякие варианты.
И первым идет адрес (для мультимастер шины и фиксированной длине пакета)
И первым идет длина пакета (для переменной длины пакета и удобства применения ДМА)
Вариантов море.

Если начнете изучать различные стандартные протоколы,
то тоже подивитесь разнообразию вкусов разработчиков...

Цитата(zltigo @ Mar 14 2016, 14:46) *
Могу Вас огорчить до "первого байта" Вы с удручающей вероятностью В РЕАЛЬНОЙ ЖИЗНИ сначала отгребете еще мусора. Так что забудьте о том, что есть какой то "первый байт".

Естественно, если задача предполагает наличие высокого уровня помех, то протокол должен это учитывать.
Например разгребать сплошной поток мусора с пакетами после радиомодема.
Но там где спешить некуда, можно сделать и попроще...
Go to the top of the page
 
+Quote Post
Tsvetik
сообщение Mar 14 2016, 12:52
Сообщение #15


Участник
*

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



Цитата(zltigo @ Mar 14 2016, 15:46) *
Могу Вас огорчить до "первого байта" Вы с удручающей вероятностью В РЕАЛЬНОЙ ЖИЗНИ сначала отгребете еще мусора. Так что забудьте о том, что есть какой то "первый байт".


Первый байт фрейма. Считайте, что мусор из приемника уже вычищен, а начало фрейма найдено. Чтобы не было необходимости долго побайтово вычитывать заголовок фрейма, хорошо бы, чтобы длина была как можно ближе к началу фреймаю. В идеале закодирована в первом байте.


Цитата(Baser @ Mar 14 2016, 15:49) *
Любите вы, zltigo, туману подпустить в витиеватой форме.
Я вот даже не понял, то ли мне улыбаться надо, то ли обижаться biggrin.gif


Я не имел ввиду жесткий порядок полей.
Встречал всякие варианты.
И первым идет адрес (для мультимастер шины и фиксированной длине пакета)
И первым идет длина пакета (для переменной длины пакета и удобства применения ДМА)
Вариантов море.

Если начнете изучать различные стандартные протоколы,
то тоже подивитесь разнообразию вкусов разработчиков...


Ну дайте хоть названия-то этих стандартных протоколов. Что изучать, что гуглить?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:08
Рейтинг@Mail.ru


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