|
|
  |
Как организовать передачу данных?, Передача по UART двух 16 битных чисел |
|
|
|
May 14 2015, 13:54
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 7-11-10
Из: Киев
Пользователь №: 60 702

|
Есть 1 передатчик 1 приемник нужно передавать 2 16-битных числа(значащих 12бит) т.е. 4 байта. Как наиболее оптимально с вашей точки зрения организовать передачу так что бы данные корректно воспринимались приемником при периодически пропадающей связи?
Мои варианты: 1 Вести временные задержки между пакетами и/или байтами и/или словами.. 2 Ввести идентификатор в каждый байт за счет не значащих бит.
|
|
|
|
|
May 14 2015, 14:33
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(LeDima @ May 14 2015, 16:54)  Есть 1 передатчик 1 приемник нужно передавать 2 16-битных числа(значащих 12бит) т.е. 4 байта. Как наиболее оптимально с вашей точки зрения организовать передачу так что бы данные корректно воспринимались приемником при периодически пропадающей связи?
Мои варианты: 1 Вести временные задержки между пакетами и/или байтами и/или словами.. 2 Ввести идентификатор в каждый байт за счет не значащих бит. Вариант самый простой - передавать числа символьными кодами, а "Возврат каретки, Перевод строки" - это разделитель кадра... Внутрь кадра можно делить контрольные суммы, можно делать перезапросы и т.д. А если 2 байта в линии на байт данных жалко, то делайте байт-стаффинг, например как в Wake. Правда тут кодирование сложнее.
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 15 2015, 06:18
|
Участник

Группа: Участник
Сообщений: 57
Регистрация: 7-11-10
Из: Киев
Пользователь №: 60 702

|
Я как раз и спрашиваю что бы велосипед не изобретать)
1 Modbus-RTU подразумевает двусторонний обмен тут же обмен односторонний строго от передатчика к приемнику.
2 Манчестер это что ?
Дополню: по сути передатчик это датчик 2 токов который постоянно меряет и постоянно передаёт, канал обмена оптоволоконный на стороне передатчика светодиод. При передаче основные проблемы перезагрузка датчика т.е. временный обрыв связи ну или полное пропадание связи.
Сообщение отредактировал LeDima - May 15 2015, 06:25
|
|
|
|
|
May 15 2015, 06:54
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(LeDima @ May 14 2015, 16:54)  Есть 1 передатчик 1 приемник нужно передавать 2 16-битных числа(значащих 12бит) т.е. 4 байта. Как наиболее оптимально с вашей точки зрения организовать передачу так что бы данные корректно воспринимались приемником при периодически пропадающей связи? Мой излюбленный метод - использовать старшие биты для маркировки начала посылки. Т.е. формирую посылку такого типа: Код 1-ый байт: 1 - 0 - 0 - 0 - 0 - 0 - D15 - D14 2-ый байт: 0 - D13 - D12 - D11 - D10 - D9 - D8 - D7 3-ый байт: 0 - D6 - D5 - D4 - D3 - D2 - D1 - D0 При этом стартовый байт легко отличим по старшей единичке, а срыв синхронизации легко определяется, если эта единичка встретилась во 2-ом или 3-ем байте (в последнем случае байт единичкой считается началом новой посылки). Правда, у меня таких байт больше трех, т.к. АЦП у меня 24-разрядный, но суть та же самая. Есть и альтернативный вариант (более простой для МК, т.к. не требует сдвига) - выносить старшие биты числа в 1-ый байт. Выглядит это так: Код 1-ый байт: 1 - 0 - 0 - 0 - 0 - 0 - D15 - D7 2-ый байт: 0 - D14 - D13 - D12 - D11 - D10 - D9 - D8 3-ый байт: 0 - D6 - D5 - D4 - D3 - D2 - D1 - D0 Дешифровка только кажется сложной, тогда как на самом деле все биты, за исключением D15 и D7, уже стоят на своих местах, а D15 и D7 нужно только к ним добавить.
|
|
|
|
|
May 15 2015, 07:13
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Xenia @ May 15 2015, 09:54)  Мой излюбленный метод - использовать старшие биты для маркировки начала посылки. Т.е. формирую посылку такого типа: Код 1-ый байт: 1 - 0 - 0 - 0 - 0 - 0 - D15 - D14 2-ый байт: 0 - D13 - D12 - D11 - D10 - D9 - D8 - D7 3-ый байт: 0 - D6 - D5 - D4 - D3 - D2 - D1 - D0 При этом стартовый байт легко отличим по старшей единичке, а срыв синхронизации легко определяется, если эта единичка встретилась во 2-ом или 3-ем байте (в последнем случае байт единичкой считается началом новой посылки). Правда, у меня таких байт больше трех, т.к. АЦП у меня 24-разрядный, но суть та же самая. Есть и альтернативный вариант (более простой для МК, т.к. не требует сдвига) - выносить старшие биты числа в 1-ый байт. Выглядит это так: Код 1-ый байт: 1 - 0 - 0 - 0 - 0 - 0 - D15 - D7 2-ый байт: 0 - D14 - D13 - D12 - D11 - D10 - D9 - D8 3-ый байт: 0 - D6 - D5 - D4 - D3 - D2 - D1 - D0 Дешифровка только кажется сложной, тогда как на самом деле все биты, за исключением D15 и D7, уже стоят на своих местах, а D15 и D7 нужно только к ним добавить. А если "D13 - D12 - D11 - D10 - D9" будут нулями? Как тогда первый байт отличить от второго?
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 15 2015, 07:41
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(iosifk @ May 15 2015, 10:13)  А если "D13 - D12 - D11 - D10 - D9" будут нулями? Как тогда первый байт отличить от второго? Подразумевается, что биты внутри байт не сползают. Т.е. это что-то вроде передачи типа UART, I2C, SPI, где байт получаешь (аппаратно!) целиком и независимо от содержимого предыдущего байта. Ну, а тестируем в поступающих байтах старший бит, как признак начала посылки. При пропуске байта, потеряется всего одна посылка, но синхронизация не будет сбита.
|
|
|
|
|
May 15 2015, 07:46
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Xenia @ May 15 2015, 10:41)  Подразумевается, что биты внутри байт не сползают. Т.е. это что-то вроде передачи типа UART, I2C, SPI, где байт получаешь (аппаратно!) целиком и независимо от содержимого предыдущего байта. Ну, а тестируем в поступающих байтах старший бит, как признак начала посылки. При пропуске байта, потеряется всего одна посылка, но синхронизация не будет сбита. Понятно, спасибо!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 15 2015, 08:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(LeDima @ May 15 2015, 13:18)  Дополню: по сути передатчик это датчик 2 токов который постоянно меряет и постоянно передаёт, канал обмена оптоволоконный на стороне передатчика светодиод. При передаче основные проблемы перезагрузка датчика т.е. временный обрыв связи ну или полное пропадание связи. Я в таких случаях просто выводил текст а ascii. printf("%d\t%d\r\n", x1, x2); Числа разделяются символом табуляции, в конце строки CR и LF. Всё это ловится терминалом и пишется в лог. Можно глазами посмотреть, можно зачитать в excel для обработки и рисования графиков. Своей программой тоже не сложно ловить - читаем строку, обрабатываем. Для борьбы с обрывами связи можно либо выдавать из устройства время (или просто порядковый номер) либо в терминале настроить добавление в лог меток времени (Br@y Terminal это умеет).
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
May 15 2015, 08:40
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(ViKo @ May 15 2015, 10:54)  Можно слегка модифицировать код от Xenia, передавать в старших двух битах номер байта. 1 0 - 0 0 D15 ... D12 0 1 - D11 ... D6 0 0 - D5 ... D0 Еще останется комбинация 1 1 для особых случаев. Это уже перестраховка. В случае предрасположенности к паранойе  имеет смысл задержать "ассимиляцию" числа, пока не убедишься, что 4-ый байт содержит старшую единичку. Вероятностью того, что два байта между двумя стартовыми байтами поменяют порядок, полагаю, можно пренебречь. Цитата(SSerge @ May 15 2015, 11:23)  Я в таких случаях просто выводил текст а ascii. printf("%d\t%d\r\n", x1, x2); printf долго работает, а при больших скоростях передачи это слишком тормозно. Кроме того, текстовая передача числовой информации слишком избыточна, чтобы оправдывать уровень своей надежности. А он, прямо скажем, невелик. Например, потеряется в посылке один байт/цифра и вы станет в 10 раз беднее  .
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|