Задержка в одну смену при получении ответных сообщений при использовании двух nRF24L01 для связи друг с другом

Когда я отправляю «a» из последовательного монитора подчиненного устройства, в окне главного подчиненного устройства отображается «car1_place_2_go = a», затем оно должно отображаться на подчиненном последовательном мониторе «a», но не отображается в ведомое последовательное окно, пока я не отправлю еще один новый символ. Таким образом, в сообщениях, отображаемых на подчиненном последовательном мониторе, есть сдвиг задержки на 1.

Мастер:

#include <SPI.h>
#include <SoftwareSerial.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // СЕ, ДНС
const byte addresses[][6] = {"00001", "00002"};

char car1_place_2_go;
char car2_place_2_go;
char temp_place = 0 ;


void setup()
{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // мастер
  radio.openReadingPipe(1, addresses[0]); // карул

  radio.setPALevel(RF24_PA_MIN);
}


void loop()
{
  delay(5);
  radio.startListening();

  if (radio.available())
  {
    radio.read(&car1_place_2_go, sizeof(car1_place_2_go));
    Serial.print("car1_place_2_go = ");
    Serial.println(car1_place_2_go);

    delay(5);
    radio.stopListening();

    radio.write(&car1_place_2_go, sizeof(car1_place_2_go));
  }
}

Подчиненный:

#include <SPI.h>
#include <SoftwareSerial.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};

char car1_place_2_go;
char car2_place_2_go;


void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00003
  radio.openReadingPipe(1, addresses[1]); // 00002

  radio.setPALevel(RF24_PA_MIN);
}


void loop()
{
  if (Serial.available() > 0)
  {
    car2_place_2_go = Serial.read();

    delay(5);
    radio.stopListening();

    radio.write(&car2_place_2_go, sizeof(car2_place_2_go));

    radio.startListening();

    if ( radio.available())
    {
      char text[32] = "";
      radio.read(&text, sizeof(text));
      Serial.println(text);
    }
  }
}

Библиотека, которую я использую: https://github.com/nRF24/RF24

, 👍-1

Обсуждение

Вероятно, вы слишком долго ждете между отправкой сообщения и прослушиванием данных, поэтому вы получаете данные только при следующей радиопередаче. Смотрите мой ответ на другой ваш вопрос nRF24. Похоже, вы можете использовать полезную нагрузку ACK для отправки и получения данных в одной радиотранзакции. Пожалуйста, не забудьте проголосовать или принять ответ, если он правильный., @MichaelT

Судя по коду, ведомое устройство постоянно отправляет последовательные данные. Разве он не должен был отправить его только один раз?, @Gerben


1 ответ


0

я обнаружил, что проблема в том, что получатель в подчиненном устройстве не видит, что ему отправляется, до следующего цикла, а это означает, что ему нужна задержка, чтобы он мог видеть, что ему передается, поэтому я добавил этот цикл while в подчиненное устройство. поэтому ведомое устройство не выходит из функции "void loop" до тех пор, пока не получит сообщение от ведущего

раб

 radio.startListening();

    while(! radio.available())
    {

    }
    if ( radio.available()) 
    {
        char text[32] = "";
        radio.read(&text, sizeof(text));
        Serial.println(text);
     }
,

вы должны принять свой собственный ответ., @esoterik