Задержка связи основного узла 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 = "";
}
@somnathbm, 👍2
Обсуждение1 ответ
Функция nRF24L01 "ACK_PAYLOAD" позволяет осуществлять двустороннюю передачу данных за одну радиотранзакцию. Это сложнее настроить, но множество руководств можно найти в Интернете, на arduino stackexchange и, конечно же, еще одним очень полезным источником является техническое описание nRF24L01. Это должно решить вашу проблему, гарантируя, что радиосообщения master/slave отправляются в одних и тех же, а не в независимых радиотранзакциях.
- Serial.parseInt() занимает больше времени, чем хотелось бы
- RF24, если операторы не читаются должным образом, даже если значение «if» неверно, оно все равно следует за соответствующим кодом.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
Какой вывод вы получаете на терминале (на базовом узле) для попыток 1 .. 9?, @KennetRunner
@KennetRunner - на терминале базового узла вывод всегда один и тот же, т. е. отправка в порядке. Судя по всему, на базовом узле проблем нет. Проблема только в главном узле, я полагаю. Но вот вопрос, почему нужный статус придет на 10-й раз?, @somnathbm