|
Опять UART, надоело городить самопальные протоколы |
|
|
|
Mar 14 2016, 11:08
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Mar 14 2016, 11:22
|
Местный
  
Группа: Участник
Сообщений: 465
Регистрация: 13-05-15
Из: Запорожье
Пользователь №: 86 663

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

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

|
Цитата(Александр1 @ Mar 14 2016, 14:22)  Например, начало/конец сообщения обозначить 2-3 символами. И только эта последовательность будет началом/окончанием сообщения. Все символы, входящие в эти последовательности, по отдельности или в другом порядке - есть данные. Управление АТ-командами - вот пример. Начало всегда АТ, а окончание LF, CR. Те же N символов могут встретиться и в двоичных данных. Например, надо передать AT команду в которой содержится другая AT команда
Сообщение отредактировал Tsvetik - Mar 14 2016, 11:34
|
|
|
|
|
Mar 14 2016, 11:38
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Tsvetik @ Mar 14 2016, 14:08)  Нужно передавать массивы двоичных данных по UART между двумя устройствами.
....
Так вот, подскажите какие-нибудь популярные реализации логических протоколов поверх UART. Необходимы легковесные протоколы, которые будут работать довольно быстро на Tiny AVR. Стандартно либо передаете данные символьными кодами. А возврат каретки и перевод строки - это конец сообщения. Медленно, т.к. один байт передается двумя посылками, но просто... И годится любая терминалка на хосте... Либо байт-стаффинг. Например WAKE от Ридико... Исходники и описания Леонид выложил... Делать бит-стаффинг нет смысла, т.к. сдвигать массив данных на микроконтроллере долго...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Mar 14 2016, 11:58
|
Участник

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

|
За WAKE спасибо.
Сообщение отредактировал Tsvetik - Mar 14 2016, 12:06
|
|
|
|
|
Mar 14 2016, 12:04
|

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

|
Цитата(Tsvetik @ Mar 14 2016, 13:08)  Один из вариантов это /xon /xoff. Его минусы в том, что символы /xon /xoff могут встретиться в передаваемых двоичных данных и их надо экранировать. Что вы называете "экранировать", не знаю, но для выделения уникального кода для управления применяется метод байт-стаффинга (byte stuffing). Но отлаживаться с ним неудобно. Обычно для простейших протоколов применяют разделение пакетов по тайм-аутам. Самый простой и удобный метод. А вообще для простеньких применений чаще всего применяют самопальные протоколы. Правда, хороший самопальный протокол можно придумать только при достаточном опыте работы и предварительном написании кучи плохих самопальных протоколов
|
|
|
|
|
Mar 14 2016, 12:20
|
Участник

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

|
Цитата(Baser @ Mar 14 2016, 15:04)  Что вы называете "экранировать", не знаю, но для выделения уникального кода для управления применяется метод байт-стаффинга (byte stuffing). Но отлаживаться с ним неудобно. Обычно для простейших протоколов применяют разделение пакетов по тайм-аутам. Самый простой и удобный метод. А вообще для простеньких применений чаще всего применяют самопальные протоколы. Правда, хороший самопальный протокол можно придумать только при достаточном опыте работы и предварительном написании кучи плохих самопальных протоколов  Байт-стаффинг и есть экранировать иначе, escape sequence Тайм-ауты нафиг. Медленно и не хочу зависимость от таймера.
|
|
|
|
|
Mar 14 2016, 12:27
|

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

|
Цитата(Tsvetik @ Mar 14 2016, 14:20)  Байт-стаффинг и есть экранировать иначе, escape sequence
Тайм-ауты нафиг. Медленно и не хочу зависимость от таймера. Ну так типовая структура любого протокола (набор полей): Стартовый байт Поле адреса Поле длины данных Поле данных Поле CRC На все это накладываете байт-стаффинг для стартового байта. Дальше просто вариации из вышеперечисленного. Но 99% протоколов промышленного применения, что я видел, не применяют байт-стаффинг и используют тайм-ауты
|
|
|
|
|
Mar 14 2016, 12:38
|

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

|
QUOTE (Baser @ Mar 14 2016, 14:27)  Но 99% протоколов промышленного применения, что я видел, не применяют байт-стаффинг и используют тайм-ауты  Людоеды племени умба-юмба не используют не только таймауты, но и вообще промышленные применения. Темные люди  , как и 99% "промышленных автоматизаторов"  . Ну а таймауты нужны В ЛЮБОМ случае. При том-же байтстаффинге для отработки ошибок использовать таймаут, как аварийное завершение фрейма и по нему-же выброс мусора.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 14 2016, 12:39
|
Участник

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

|
Цитата(Baser @ Mar 14 2016, 15:27)  Ну так типовая структура любого протокола (набор полей): Стартовый байт Поле адреса Поле длины данных Поле данных Поле CRC На все это накладываете байт-стаффинг для стартового байта. Дальше просто вариации из вышеперечисленного. Но 99% протоколов промышленного применения, что я видел, не применяют байт-стаффинг и используют тайм-ауты  Да вот что-то не нравится мне эта схема вот чем: Длина идет не первым байтом. Если МК с DMA, то нужно будет несколько входов в обработчик прежде чем можно будет включить DMA. Все, что здесь предлагали это какой-то самопал. Неужели нет чего-то более-менее стандартног-популярного? Может, рекомендованного IEC или еще каким-то международным институтом?
Сообщение отредактировал Tsvetik - Mar 14 2016, 12:43
|
|
|
|
|
Mar 14 2016, 12:46
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 14 2016, 12:49
|

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

|
Цитата(zltigo @ Mar 14 2016, 14:38)  Людоеды племени умба-юмба не используют не только таймауты, но и вообще промышленные применения. Темные люди  , как и 99% "промышленных автоматизаторов"  . Любите вы, zltigo, туману подпустить в витиеватой форме. Я вот даже не понял, то ли мне улыбаться надо, то ли обижаться Цитата Да вот что-то не нравится мне эта схема вот чем: Длина идет не первым байтом. Если МК с DMA, то нужно будет несколько входов в обработчик прежде чем можно будет включить DMA Я не имел ввиду жесткий порядок полей. Встречал всякие варианты. И первым идет адрес (для мультимастер шины и фиксированной длине пакета) И первым идет длина пакета (для переменной длины пакета и удобства применения ДМА) Вариантов море. Если начнете изучать различные стандартные протоколы, то тоже подивитесь разнообразию вкусов разработчиков... Цитата(zltigo @ Mar 14 2016, 14:46)  Могу Вас огорчить до "первого байта" Вы с удручающей вероятностью В РЕАЛЬНОЙ ЖИЗНИ сначала отгребете еще мусора. Так что забудьте о том, что есть какой то "первый байт". Естественно, если задача предполагает наличие высокого уровня помех, то протокол должен это учитывать. Например разгребать сплошной поток мусора с пакетами после радиомодема. Но там где спешить некуда, можно сделать и попроще...
|
|
|
|
|
Mar 14 2016, 12:52
|
Участник

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

|
Цитата(zltigo @ Mar 14 2016, 15:46)  Могу Вас огорчить до "первого байта" Вы с удручающей вероятностью В РЕАЛЬНОЙ ЖИЗНИ сначала отгребете еще мусора. Так что забудьте о том, что есть какой то "первый байт". Первый байт фрейма. Считайте, что мусор из приемника уже вычищен, а начало фрейма найдено. Чтобы не было необходимости долго побайтово вычитывать заголовок фрейма, хорошо бы, чтобы длина была как можно ближе к началу фреймаю. В идеале закодирована в первом байте. Цитата(Baser @ Mar 14 2016, 15:49)  Любите вы, zltigo, туману подпустить в витиеватой форме. Я вот даже не понял, то ли мне улыбаться надо, то ли обижаться Я не имел ввиду жесткий порядок полей. Встречал всякие варианты. И первым идет адрес (для мультимастер шины и фиксированной длине пакета) И первым идет длина пакета (для переменной длины пакета и удобства применения ДМА) Вариантов море. Если начнете изучать различные стандартные протоколы, то тоже подивитесь разнообразию вкусов разработчиков... Ну дайте хоть названия-то этих стандартных протоколов. Что изучать, что гуглить?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|