Задержка связи основного узла RF24Mesh

Я пытаюсь построить ячеистую сеть, используя 4 модуля nRF24L01, напрямую подключенных к Arduino Uno, где 1 модуль является главным узлом, а остальные — базовыми узлами.

Рабочий процесс выглядит следующим образом

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

Но когда главный узел получает статус ответа от базовых узлов, возникает проблема. Главный узел не получает данные немедленно. Мне приходится повторно отправлять команду с последовательного монитора Arduino, и в 10-й раз главный узел может прочитать статус ответа от базовых узлов. Каждый раз ровно с 10-го раза.

Вот источник.

главный узел

// глобальные переменные
int dat2;
String temp1 = "";
boolean actualDataSent = false;

// получаем ввод от последовательного монитора arduino

 while (Serial.available() > 0) {
      // моя команда
      String temp1 = Serial.readString();
}

// запись блока
if (actualDataSent == false && temp1 != "") {

    // отправляем эти данные на базовый узел по одному символу
    for (int j = 0; j < mesh.addrListTop; j++)
    {
      for (int k = 0; k < temp1.length(); k++) {
        char ch = (char)temp1.charAt(k);
        Serial.print("NodeID: ");
        Serial.print(mesh.addrList[j].nodeID);
        Serial.print(" RF24Network Address: 0");
        Serial.println(mesh.addrList[j].address, OCT);
        RF24NetworkHeader header(mesh.addrList[j].address, OCT);
        Serial.println( network.write(header, &ch, sizeof(ch)) == 1 ? F("Send OK") : F("Send Fail"));
      }
      actualDataSent = true;
    }
    temp1 = "";
  }

// чтение блока
else if (network.available() && actualDataSent == true) {
    RF24NetworkHeader header;
    network.peek(header);

    switch (header.type) {
      case 'M':
        network.read(header, &dat2, sizeof(dat2));
        Serial.print("Got: ");
        Serial.print(dat2);
        Serial.print(" from RF24Network address 0");
        Serial.println(header.from_node, OCT);
        actualDataSent = false;
        break;
      default: network.read(header, 0, 0); Serial.print("Not M case"); Serial.println(header.type); actualDataSent = false; break;
    }
  }

базовый узел:

//глобальные переменные

String mypayload = "";
int res1;

// получаем команду от мастера
while (network.available()) {
    RF24NetworkHeader header;
    network.read(header, &payload, sizeof(payload));
    mypayload.concat(payload);
  }
  if (mypayload != "")
  {
    Serial.print("Received data: ");
    Serial.println(mypayload);
    if ((mypayload == "100%"))
    {
      res1 = 1;
      Serial.println("Turn ON");
      if (!mesh.write(&res1, 'M', sizeof(res1))) {
      if ( ! mesh.checkConnection() ) {
        Serial.println("Renewing Address");
        mesh.renewAddress();
      } else {
        Serial.println("Send fail, Test OK");
      }
    } else {
      Serial.print("Send OK: "); Serial.println(res1);
    }
    }
    else if (mypayload == "0%")
    {
      res1 = '1';
      Serial.println("Turn OFF");
      if (!mesh.write(&res1, 'M', sizeof(res1))) {
      if ( ! mesh.checkConnection() ) {
        Serial.println("Renewing Address");
        mesh.renewAddress();
      } else {
        Serial.println("Send fail, Test OK");
      }
    } else {
      Serial.print("Send OK: "); Serial.println(res1);
    }
    }
    mypayload = "";
  }

, 👍2

Обсуждение

Какой вывод вы получаете на терминале (на базовом узле) для попыток 1 .. 9?, @KennetRunner

@KennetRunner - на терминале базового узла вывод всегда один и тот же, т. е. отправка в порядке. Судя по всему, на базовом узле проблем нет. Проблема только в главном узле, я полагаю. Но вот вопрос, почему нужный статус придет на 10-й раз?, @somnathbm


1 ответ


1

Функция nRF24L01 "ACK_PAYLOAD" позволяет осуществлять двустороннюю передачу данных за одну радиотранзакцию. Это сложнее настроить, но множество руководств можно найти в Интернете, на arduino stackexchange и, конечно же, еще одним очень полезным источником является техническое описание nRF24L01. Это должно решить вашу проблему, гарантируя, что радиосообщения master/slave отправляются в одних и тех же, а не в независимых радиотранзакциях.

,