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

 
 
> Как организовать передачу данных?, Передача по 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
 
Start new topic
Ответов
Xenia
сообщение May 15 2015, 06:54
Сообщение #2


Гуру
******

Группа: Модератор 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
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Модератор 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
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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



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

 


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


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