Многопоточная передача данных через Serial порт
- Войдите на сайт для отправки комментариев
Привет всем, при создании одного проекта наткнулся на проблему передачи нескольких переменных.
Суть проекта: есть две Arduino Uno r3, два модуля APC220 v3.0
На Ардуино-приемнике стоит LCD дисплей с конвертером I2C, на который будут выводиться разные данные
На Ардуино-передатчике стоит несколько измерительных приборов, типа дальнометр, датчик дождя, температуры, влажности, пламени и еще несколько.
Суть проблемы: С Ардуино-передатчика будут посылаться поочередно куча значений с разных датчиков, а на ардуино-приемнике надо сделать так, что бы каждое значение с Serial порта помещалось в нужную переменную, а затем выводилось бы на дисплей(температура в температуру, влажность в влажность и т.д.) как реализовать захват нужных переменных?
Заранее спасибо
используй RS-485 и протокол типа MODBUS
например вот тут обсуждаем http://arduino.ru/forum/proekty/ocherednoi-umnyi-dom-na-etot-raz-modulnaya-sistema
А можно "договориться" что в сериал идет не 1 байт, а "пакет", в котором всегда первым байтом идет "номер" передаваемой переменной, вторым, к примеру, её длина 1/2/4 байта или вовсе float и только потом столько байт - сколько надо. Делов-то. :)
А можно "договориться" что в сериал идет не 1 байт, а "пакет", в котором всегда первым байтом идет "номер" передаваемой переменной, вторым, к примеру, её длина 1/2/4 байта или вовсе float и только потом столько байт - сколько надо. Делов-то. :)
Извините, можно поподробнее рассказать об этом? А точнее как реализовать это в примнике и передатчике на программном уровне?
Да как хотите! Делаете класс/набор функций, макросов "над" сериальным интерфейсом, которые будут передавать И принимать байтики в/из сериала в строго заданном порядке и количестве и .. фсё. Точно также как передаются Ейзернет пакеты... только там 7-и уровневая модель оси, а вам нужен 1 доп. уровень.
Примерно так:
Тут serial.print() надо конечно заменить на вменяемую функцию отправки в ваш последовательный порт, а также почитать кондуит по написанию функций с переменным числом параметров и как их оттудова выковыривать. Я использовал argv[0] просто для примеру. Смысл в том, что цикл отправки значения повторяется столько байт отправки - сколько у вас прописан размер переменной. И сдвигами по 8 бит вы получаете каждый следующий байт значения для отправки. Конечно, правильнее тут сначала преобразовать полученный аргумент в какому-нить unsigned long для целых чисел и/или куда-то ишо .. но не думаю что вам это обязательно.
Аналогично пишется и приемник. Главное чтобы он свои пункты выполнял в правильном порядке: пришел первый байтик - это номер переменной, пришел второй - это сколько ишо придет .. далее также принимаем в цикле байтики и сдвигами "взад" формируем исходное число в точке приема.
Примерно фсё. :)
Можно ли с вами как то связаться, а то мне не очень понятен код программы и как ее редактировать под свои нужды
Это не программа, а так, набросок идеи. Кстати, тут хорошо как раз применять ООП решения, тогда всё станет гораздо проще и не потребуется писать функции с переменным числом аргументов (...). Делаете класс и объявляете в нем несколько перегруженных методов для вывода в сериал, каждый на свой тип значений ваших переменных. Свойства объектов класса можно взять хоть из этой же структуры .. как-то так.
P.S. Связываться рекомендую в разделе "Ищу исполнителя" .. там есть к кому обратиться. Я - слишком ленив, да и так занят по 10-14 часов в сутки .. извините уж.