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

 
 
 
Reply to this topicStart new topic
> Как организовать передачу данных?, Передача по UART двух 16 битных чисел
LeDima
сообщение May 14 2015, 13:54
Сообщение #1


Участник
*

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



Есть 1 передатчик 1 приемник нужно передавать 2 16-битных числа(значащих 12бит) т.е. 4 байта.
Как наиболее оптимально с вашей точки зрения организовать передачу так что бы данные корректно воспринимались приемником при периодически пропадающей связи?

Мои варианты:
1 Вести временные задержки между пакетами и/или байтами и/или словами..
2 Ввести идентификатор в каждый байт за счет не значащих бит.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение May 14 2015, 14:21
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(LeDima @ May 14 2015, 16:54) *
2 Ввести идентификатор в каждый байт за счет не значащих бит.


Плохая связь - это ещё и ошибки. Лучше всего заголовок, помехоустойчивое кодирование, контрольная сумма и манчестер.
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 14 2015, 14:33
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
megajohn
сообщение May 14 2015, 15:01
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(LeDima @ May 14 2015, 16:54) *
Мои варианты:
1 Вести временные задержки между пакетами и/или байтами и/или словами..
2 Ввести идентификатор в каждый байт за счет не значащих бит.


все ваши варианты это изобретение велосипеда. Реализуйте Modbus-RTU или любой другой протокол.


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
LeDima
сообщение May 15 2015, 06:18
Сообщение #5


Участник
*

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



Я как раз и спрашиваю что бы велосипед не изобретать)

1 Modbus-RTU подразумевает двусторонний обмен тут же обмен односторонний строго от передатчика к приемнику.

2 Манчестер это что ?

Дополню: по сути передатчик это датчик 2 токов который постоянно меряет и постоянно передаёт, канал обмена оптоволоконный на стороне передатчика светодиод. При передаче основные проблемы перезагрузка датчика т.е. временный обрыв связи ну или полное пропадание связи.

Сообщение отредактировал LeDima - May 15 2015, 06:25
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 15 2015, 06:54
Сообщение #6


Гуру
******

Группа: Модератор 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 нужно только к ним добавить.
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 15 2015, 07:13
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 15 2015, 07:41
Сообщение #8


Гуру
******

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



Цитата(iosifk @ May 15 2015, 10:13) *
А если "D13 - D12 - D11 - D10 - D9" будут нулями? Как тогда первый байт отличить от второго?


Подразумевается, что биты внутри байт не сползают. Т.е. это что-то вроде передачи типа UART, I2C, SPI, где байт получаешь (аппаратно!) целиком и независимо от содержимого предыдущего байта. Ну, а тестируем в поступающих байтах старший бит, как признак начала посылки. При пропуске байта, потеряется всего одна посылка, но синхронизация не будет сбита.
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 15 2015, 07:46
Сообщение #9


Гуру
******

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



Цитата(Xenia @ May 15 2015, 10:41) *
Подразумевается, что биты внутри байт не сползают. Т.е. это что-то вроде передачи типа UART, I2C, SPI, где байт получаешь (аппаратно!) целиком и независимо от содержимого предыдущего байта. Ну, а тестируем в поступающих байтах старший бит, как признак начала посылки. При пропуске байта, потеряется всего одна посылка, но синхронизация не будет сбита.

Понятно, спасибо!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 15 2015, 07:54
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Можно слегка модифицировать код от Xenia, передавать в старших двух битах номер байта.
1 0 - 0 0 D15 ... D12
0 1 - D11 ... D6
0 0 - D5 ... D0
Еще останется комбинация 1 1 для особых случаев.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 15 2015, 08:23
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 15 2015, 08:40
Сообщение #12


Гуру
******

Группа: Модератор 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 для особых случаев.

Это уже перестраховка. В случае предрасположенности к паранойе sm.gif имеет смысл задержать "ассимиляцию" числа, пока не убедишься, что 4-ый байт содержит старшую единичку. Вероятностью того, что два байта между двумя стартовыми байтами поменяют порядок, полагаю, можно пренебречь.

Цитата(SSerge @ May 15 2015, 11:23) *
Я в таких случаях просто выводил текст а ascii.
printf("%d\t%d\r\n", x1, x2);

printf долго работает, а при больших скоростях передачи это слишком тормозно. Кроме того, текстовая передача числовой информации слишком избыточна, чтобы оправдывать уровень своей надежности. А он, прямо скажем, невелик. Например, потеряется в посылке один байт/цифра и вы станет в 10 раз беднее sm.gif.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 10:07
Рейтинг@Mail.ru


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