Отправка и получение нескольких значений переменных в одном сообщении

О программировании Arduino, использование библиотек, примеры и общие вопросы программирования.
Ответить
Berk
Сообщения: 81
Зарегистрирован: 11 окт 2017, 22:05

Отправка и получение нескольких значений переменных в одном сообщении

Сообщение Berk »

Всем привет!!!

Не так давно озадачивался проблемой передачи значений нескольких переменных на контролер или с ноды на ноду. Помню помучился. Выделил код преобразований в отдельный тестовый скетч(для наглядности, см. в мониторе порта), выкладываю здесь, думаю кому нибудь пригодится обязательно. Если кто может предложить более оптимизированный код, прошу выложить сюда.

Код: Выделить всё


#define MY_RADIO_RF24
#define MY_DEBUG
#define TEST 200
static uint32_t update_timer;
static uint16_t update_interval = 15000;
byte s_a = 99;
byte s_b = 255;
byte d_a, d_b;
#include <MySensors.h>
MyMessage msg_t(TEST, V_VAR1);

void preHwInit()
{
}


void before()
{
}


void presentation()
{
  sendSketchInfo("TEST_NODE", "1.1");
  present(TEST, S_CUSTOM);
}


void setup() {
  system("chcp 1251");
  Serial.print("Переменная тип byte s_a: ");
  Serial.println(s_a);
  Serial.print("Переменная тип byte s_b: ");
  Serial.println(s_b);
  String A = (String(s_a) + "," + String(s_b));
  Serial.print("Объединяем и переводим в String для передачи на контролер: ");
  Serial.println(A);
  int str_len = A.length() + 1;
  Serial.print("Вычисляем длину строки +1(признак завершения строки): ");
  Serial.println(str_len);
  char my_sA[str_len];
  A.toCharArray(my_sA, str_len);
  Serial.print("Конвертируем строку в массив соответсвующей длинны: ");
  Serial.println( my_sA );
  Serial.println("Отправляем на контролер: ");
  send(msg_t.set(my_sA));
}


void loop()
{
  if (millis() - update_timer > update_interval) {
    update_timer = millis();
    Serial.println("Делаем запрос на контролер значения сенсора: ");
    request(TEST, V_VAR1);
    wait(2000, TEST, V_VAR1);
  }
}


void receive(const MyMessage & message) {
  if (mGetCommand(message) == C_SET) {
    if (message.sensor == TEST) {
      if (message.type ==  V_VAR1) {
        String B = message.getString();
        Serial.print("Полученное от контролера значение String: ");
        Serial.println(B);
        int str_len = B.length() + 1;
        char my_sB[str_len];
        B.toCharArray(my_sB, str_len);
        d_a = atoi(strtok(my_sB, ","));
        d_b = atoi(strtok(NULL, ","));
        Serial.println("Разбираем принятую строку String на переменные: ");
        Serial.print("Переменная тип byte d_a: ");
        Serial.println(d_a);
        Serial.print("Переменная тип byte d_b: ");
        Serial.println(d_b);
      }
    }
  }
}



Ответить