Многопоточная передача данных через Serial порт

Inhawk
Offline
Зарегистрирован: 06.04.2016

Привет всем, при создании одного проекта наткнулся на проблему передачи нескольких переменных.

Суть проекта: есть две Arduino Uno r3, два модуля APC220 v3.0

На Ардуино-приемнике стоит LCD дисплей с конвертером I2C, на который будут выводиться разные данные

На Ардуино-передатчике стоит несколько измерительных приборов, типа дальнометр, датчик дождя, температуры, влажности, пламени и еще несколько.

Суть проблемы: С Ардуино-передатчика будут посылаться поочередно куча значений с разных датчиков, а на ардуино-приемнике надо сделать так, что бы каждое значение с Serial порта помещалось в нужную переменную, а затем выводилось бы на дисплей(температура в температуру, влажность в влажность и т.д.) как реализовать захват нужных переменных?

Заранее спасибо

vde69
Offline
Зарегистрирован: 10.01.2016

используй RS-485 и протокол типа MODBUS

например вот тут обсуждаем http://arduino.ru/forum/proekty/ocherednoi-umnyi-dom-na-etot-raz-modulnaya-sistema

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А можно "договориться" что в сериал идет не 1 байт, а "пакет", в котором всегда первым байтом идет "номер" передаваемой переменной, вторым, к примеру, её длина 1/2/4 байта или вовсе float и только потом столько байт - сколько надо. Делов-то. :)

Inhawk
Offline
Зарегистрирован: 06.04.2016

Arhat109-2 пишет:

А можно "договориться" что в сериал идет не 1 байт, а "пакет", в котором всегда первым байтом идет "номер" передаваемой переменной, вторым, к примеру, её длина 1/2/4 байта или вовсе float и только потом столько байт - сколько надо. Делов-то. :)

Извините, можно поподробнее рассказать об этом? А точнее как реализовать это в примнике и передатчике на программном уровне?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да как хотите! Делаете класс/набор функций, макросов "над" сериальным интерфейсом, которые будут передавать И принимать байтики в/из сериала в строго заданном порядке и количестве и .. фсё. Точно также как передаются Ейзернет пакеты... только там 7-и уровневая модель оси, а вам нужен 1 доп. уровень.

Примерно так:

// определяем номера передаваемых переменных и их размер(типы):
#define numVar1    1
#define numVar2    2
//...
#define lenVar1      2
#define lenVar2      1

// .. или так:
struct{
  uint8_t    _number;
  uint8_t    _length;
} myVars[] = {{1,2},{2,1}};

// создаем функцию отправки в сериал в заданной последовательности:
void mySerialLink(uint8_t index, ...)
{
    uint8_t idx = myVars[index]._length; // счетчик байт значения, пригодится.
    uint8_t val1;                                    // один байт значения..

    // 1. отправляем номер переменной по индексу
    Serial.print(myVars[index]._number);
    // 2. отправляем сколько байт ловить дальше
    Serial.print(idx);
    // 3. отправляем из _argv[] значение переменной в виде заданного количества байт:
    for(; idx>0; idx--){
        val1 = (uint8_t)(argv[0]>>=8);
        Serial.print(val1);
    }
}

Тут serial.print() надо конечно заменить на вменяемую функцию отправки в ваш последовательный порт, а также почитать кондуит по написанию функций с переменным числом параметров и как их оттудова выковыривать. Я использовал argv[0] просто для примеру. Смысл в том, что цикл отправки значения повторяется столько байт отправки - сколько у вас прописан размер переменной. И сдвигами по 8 бит вы получаете каждый следующий байт значения для отправки. Конечно, правильнее тут сначала преобразовать полученный аргумент в какому-нить unsigned long для целых чисел и/или куда-то ишо .. но не думаю что вам это обязательно.

Аналогично пишется и приемник. Главное чтобы он свои пункты выполнял в правильном порядке: пришел первый байтик - это номер переменной, пришел второй - это сколько ишо придет .. далее также принимаем в цикле байтики и сдвигами "взад" формируем исходное число в точке приема.

Примерно фсё. :)

Inhawk
Offline
Зарегистрирован: 06.04.2016

Можно ли с вами как то связаться, а то мне не очень понятен код программы и как ее редактировать под свои нужды

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это не программа, а так, набросок идеи. Кстати, тут хорошо как раз применять ООП решения, тогда всё станет гораздо проще и не потребуется писать функции с переменным числом аргументов (...). Делаете класс и объявляете в нем несколько перегруженных методов для вывода в сериал, каждый на свой тип значений ваших переменных. Свойства объектов класса можно взять хоть из этой же структуры .. как-то так.

P.S. Связываться рекомендую в разделе "Ищу исполнителя" .. там есть к кому обратиться. Я - слишком ленив, да и так занят по 10-14 часов в сутки .. извините уж.