Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как организовать передачу данных?
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
LeDima
Есть 1 передатчик 1 приемник нужно передавать 2 16-битных числа(значащих 12бит) т.е. 4 байта.
Как наиболее оптимально с вашей точки зрения организовать передачу так что бы данные корректно воспринимались приемником при периодически пропадающей связи?

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


Плохая связь - это ещё и ошибки. Лучше всего заголовок, помехоустойчивое кодирование, контрольная сумма и манчестер.
iosifk
Цитата(LeDima @ May 14 2015, 16:54) *
Есть 1 передатчик 1 приемник нужно передавать 2 16-битных числа(значащих 12бит) т.е. 4 байта.
Как наиболее оптимально с вашей точки зрения организовать передачу так что бы данные корректно воспринимались приемником при периодически пропадающей связи?

Мои варианты:
1 Вести временные задержки между пакетами и/или байтами и/или словами..
2 Ввести идентификатор в каждый байт за счет не значащих бит.

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


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

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

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

Дополню: по сути передатчик это датчик 2 токов который постоянно меряет и постоянно передаёт, канал обмена оптоволоконный на стороне передатчика светодиод. При передаче основные проблемы перезагрузка датчика т.е. временный обрыв связи ну или полное пропадание связи.
Xenia
Цитата(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 нужно только к ним добавить.
iosifk
Цитата(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" будут нулями? Как тогда первый байт отличить от второго?
Xenia
Цитата(iosifk @ May 15 2015, 10:13) *
А если "D13 - D12 - D11 - D10 - D9" будут нулями? Как тогда первый байт отличить от второго?


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

Понятно, спасибо!
ViKo
Можно слегка модифицировать код от Xenia, передавать в старших двух битах номер байта.
1 0 - 0 0 D15 ... D12
0 1 - D11 ... D6
0 0 - D5 ... D0
Еще останется комбинация 1 1 для особых случаев.
SSerge
Цитата(LeDima @ May 15 2015, 13:18) *
Дополню: по сути передатчик это датчик 2 токов который постоянно меряет и постоянно передаёт, канал обмена оптоволоконный на стороне передатчика светодиод. При передаче основные проблемы перезагрузка датчика т.е. временный обрыв связи ну или полное пропадание связи.

Я в таких случаях просто выводил текст а ascii.
printf("%d\t%d\r\n", x1, x2);
Числа разделяются символом табуляции, в конце строки CR и LF.
Всё это ловится терминалом и пишется в лог.
Можно глазами посмотреть, можно зачитать в excel для обработки и рисования графиков.
Своей программой тоже не сложно ловить - читаем строку, обрабатываем.
Для борьбы с обрывами связи можно либо выдавать из устройства время (или просто порядковый номер) либо в терминале настроить добавление в лог меток времени (Br@y Terminal это умеет).
Xenia
Цитата(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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.