|
Опять 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, 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: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 15 2016, 17:34
|
Участник

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

|
Цитата(jcxz @ Mar 15 2016, 16:05)  Не смешивайте уровни обработки. Драйвер DMA не должен никак зависеть от протокола в котором передаётся поток. Он вообще ничего не должен знать о протоколе. Программируете DMA на любой удобный размер, запускаете и дополнительно, по таймеру отслеживаете состояние работы DMA, с принудительным завершением и перезапуском при простое принимаемого потока. Ну понятно. Это просто вспомнилось. К месту или не к месту  Ну, с одной стороны tiny, а с другой ARM7 или PC при тестах и отладке. Так что требование к DMA вторично. С одной стороны, когда DMA не знает ничего о протоколе будет легко разделить передачу на различные уровни обработки. С другой стороны, добавление уровней обработки часто означает добавление дополнительных буфферов и сильного увеличения уровня вложенности функций.
|
|
|
|
|
Mar 16 2016, 06:01
|
Гуру
     
Группа: Свой
Сообщений: 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 и каким образом тот кладёт байты в кольцевой буфер.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|