Передача пакета данных
- Войдите на сайт для отправки комментариев
Чт, 28/11/2013 - 07:13
Добрый день
Поскажите как грамотно сфрмровать пакет данных на передатчике???
Есть следующие условия:
- тип датчика << 1 - DS18B20; 2 - DS1990; 3 - DHT; и т.д.
- порядковый номер датчика << числовое значение от 0 до 9999
- значение датчика << числовое значение от -9999 до 9999
- разделитель << _
Пакет формата :
3-0-23.2_2-0-4
т.е датчик DHT, порядковый номер 0, значение 23.2
датчик DS1990, порядковый номер 4
Ну как-то так
Заранее спасибо
А чем Вам предложенный Вами формат не нравится? Разумеется вместо - лучше использовать другой символ, а то отрицательные значения нельзя будет передавать.
Serial.println("3-0-23.2_2-0-4");
так сойдет?
Ха на счет отрицательных значений это надо проверить...
Вот какой функцией записать зачения фатчиков в такой форма на передатчике, а потом обратно разгруппировать на приемнике??? Вот в чем вопрос???
Задача абстрактная, не написано кто отправляет и кто получает и по какому каналу, а потому несколько вариантов описывать нет смысла
билбиотека RF24network
Передатчик и приемник.
Нужно опросить все датчики сформировать пакет даенных на передатчике =>принять и полученные данные разложить по полочкам тип датчика и его значение
RF24 не использовал, но, похоже в ней есть пересылка строк (максимальнуюдлину не знаю), потому есть пара вариантов:
1. Собирать в строку и посылать её
2. Хранить данные в виде структуры и посылать в виде структуры
Второй вариант, на мой взгляд более хорош, потому что посылка будет короче и не требует парсить данные.
Структура может быть, например, такой:
А дальше уже тоже варианты - слать по одной структуре (менее затратный по памяти вариант) или собирать их в общую массу и высылать все в едином массиве структур (памяти займет побольше).
вот это есть даже так
Вопрос как засуть в long sensor_data значения скажеи 3х датчиков???
Давайте посчитаем. -9999..9999 - это 14 бит плюс знак, 15 * 3 = 45 бит. 45 бит - это 6 байт.
unsigned long - это 4 байта.
По двум - войдут легко.
вот это есть даже так
Вопрос как засуть в long sensor_data значения скажеи 3х датчиков???
2 + 2 + 2 + 4 + 2 = 12 bytes
А зачем адреса и команды двухбайтовые делать ?
1 + 1 + 1 + 2 + 2 + 2 + 1 =10 и ещё 2 байта в запасе
а зачем данные от разных датчиков засовыать в один пакет? это же неудобно...
а зачем данные от разных датчиков засовыать в один пакет? это же неудобно...
а какие есть варианты?
А зачем адреса и команды двухбайтовые делать ?
1 + 1 + 1 + 2 + 2 + 2 + 1 =10 и ещё 2 байта в запасе
вот смотри у меня только на одном передатчике 5 температур, 4 дискретных входа, 2 управляемых порта + аналоговые данные. А таких передатчиков допустим 5 штук(и не факт, что сигналы будут идентичны) + количествой передатчиков возможно и выростет. У меня список огроменный будет будет
вот смотри у меня только на одном передатчике 5 температур, 4 дискретных входа, 2 управляемых порта + аналоговые данные. А таких передатчиков допустим 5 штук(и нефакт что сигналы будут идентичны) + количествой передатчиков возможно и выростет. У меня список огроменный будет будет
задам направляющий вопрос!
у вас каждый передатчик будет иметь свою форму пакета в зависимости от количества входов и выходов?
какой функцией данные дальше как из пакета
unsigned
int
sensor_data_1
вытащить?мне же придется ими пользоватся?
- тип отдельно
- значение отдельно
Вот коряво попробовал сделать
чем вас не устраивает? вполне себе вариант.
единственно я бы проверил такую конструкцию пакета на чем нибуть маленьком.... а то практика показывает не все пакеты одинаково полезны. некоторые мини не хотят принимать большие пакеты в связи с тем что памяти у них не очень много.
я думал над таким видом:
Client_1_ds_0 и значение отдельно
Client_1 - это номер передатчика
ds - тип датчика
0 - его порядковый номер
а в приемнике уже просто делаем сравнение:
ну и понаписать все возможные варианты.
Просто мне охото чтобы пакет был не четко описан , а был универсальным и мне не пришлось добивать новые данные при увеличении киентов
ну так и расписывайте пакет как вам нравится. поместите в него хоть мильен переменных всяких разных.. кто ж вам запрещает?
Я же говорю НЕПРИЕМЛИМО!!!
Поэтому и хочу формат, шаблон как охото называйте...
чтобы не прописывать миллион клиентов...
вот гдебы нарыть пример готового пакета и его обработку на приемике????
т.е. формировать пакет и обычной функцией
switch
(...)
выбирать данные сравнвая их?
пара замечаний
1. тип датчика и номер датчика - дублирующаяся информация. заведите список датчиков с уникальными сквозными id и передавайте только его. по id вы однозначно определите и тип, и номер
2. зачем id сообщения? если пакет получен, то все ок, если потерян - да и бог с ним, не ракету же запускаете. а иначе надо контролировать пропуски, чего-то делать - зачем?
3. в структуре надо делать контроль целостности. по сути, вы считываете из входного потока sizeof(payload) байт, говорите "это - мой пакет" и начинаете его разбирать по частям. а если пакет придет не полный, или начнете считывать с середины? Можно в начале пакета писать какую-то сигнатуру, по ней определять начало пакета и от нее отсчитывать нужное количество байт. а в конце пакета еще контрольную сумму
Поскажите как и принятого пакета сформировыать переменную согласно таблице и записать в нее переменную?
вот пакет:
Допустим я поличил данные типа:
я то знаю что это пакет от Клиента 2, Серверу 0, Button_1, значение 1
Подскажите как после принятоого пакета сформаровалось переменная:
пара замечаний
1. тип датчика и номер датчика - дублирующаяся информация. заведите список датчиков с уникальными сквозными id и передавайте только его. по id вы однозначно определите и тип, и номер
2. зачем id сообщения? если пакет получен, то все ок, если потерян - да и бог с ним, не ракету же запускаете. а иначе надо контролировать пропуски, чего-то делать - зачем?
3. в структуре надо делать контроль целостности. по сути, вы считываете из входного потока sizeof(payload) байт, говорите "это - мой пакет" и начинаете его разбирать по частям. а если пакет придет не полный, или начнете считывать с середины? Можно в начале пакета писать какую-то сигнатуру, по ней определять начало пакета и от нее отсчитывать нужное количество байт. а в конце пакета еще контрольную сумму
Спасибо заменачания приняты