Не получаем данные от NRF24L01

Я пытаюсь отправить данные с одной платы Arduino на другую, используя NRF24L01, подключаясь к двум концам двух плат Arduino. Tx мигает на передающей стороне (плата Arduino 1), но принимающая сторона (плата Arduino 2) не получает от него никакой информации. Вот мой код.

Передающая сторона (плата Arduino 1)

#include <SPI.h>
#include "RF24.h"

RF24 myRadio(0, 1);
byte addresses[][6] = {"0"};

struct package
{
    int id = 1;
    float longitude = 0.0;
    float latitude = 0.0;
    char text[100] = "Geographic coordinates";
};

typedef struct package Package;
Package data;

void setup()
{
    Serial.begin(115200);
    delay(1000);
    myRadio.begin();
    myRadio.setChannel(115);
    myRadio.setPALevel(RF24_PA_MAX);
    myRadio.setDataRate(RF24_250KBPS);
    myRadio.openWritingPipe(addresses[0]);
    delay(1000);
}

void loop()
{
    myRadio.write(&data, sizeof(data));

    Serial.print("\nPackage:");
    Serial.print(data.id);
    Serial.print("\n");
    Serial.println(data.longitude);
    Serial.println(data.latitude);
    Serial.println(data.text);
    data.id = data.id + 1;
    data.longitude = data.longitude + 0.1;
    data.latitude = data.latitude + 0.1;
    delay(1000);
}

Принимающая сторона (плата Arduino 2)

#include <SPI.h>
#include "RF24.h"

RF24 myRadio(7, 8);
struct package
{
    int id = 0;
    float longitude = 0.0;
    float latitude = 0.0;
    char text[100] = "empty";
};

byte addresses[][6] = {"0"};

typedef struct package Package;
Package data;

void setup()
{
    Serial.begin(115200);
    delay(1000);
    myRadio.begin();
    myRadio.setChannel(115);
    myRadio.setPALevel(RF24_PA_MAX);
    myRadio.setDataRate(RF24_250KBPS);
    myRadio.openReadingPipe(1, addresses[0]);
    myRadio.startListening();
    delay(1000);
}

void loop()
{

    if (myRadio.available())
    {
       while (myRadio.available())
       {
           myRadio.read(&data, sizeof(data));
       }
        Serial.print("\nPackage:");
        Serial.print(data.id);
        Serial.print("\n");
        Serial.println(data.longitude);
        Serial.println(data.latitude);
        Serial.println(data.text);
    }

}

Вот как я соединил Arduino и NRF24L01.

Есть ли причина, по которой я не получаю данные с передающей стороны?

, 👍0

Обсуждение

попробуйте myRadio.readBytes(&data, sizeof(data)); Какую библиотеку nRF24 вы используете?, @Juraj

@Юрай RF24.h от TMRh20, @TRomesh

он не реализует Stream, поэтому у него нет readBytes, @Juraj

@Юрай, ты имеешь в виду myRadio.available() >= sizeof(data) ?, @TRomesh

он не будет работать. Я удалил комментарий. структура больше буфера приема, @Juraj

он может передавать только 32 байта полезной нагрузки. отправлять и получать данные частями по 32 байта, @Juraj

Так стоит ли мне изменить структуру? Это работало несколько недель назад, а сейчас нет. Я купил новый модуль Arduino и NRF24, но все равно безуспешно :(, @TRomesh

с той же библиотекой и этой структурой? возможно, это сработало, но не передал весь массив символов, @Juraj

измените while (myRadio.available()) на if (myRadio.available()), @Juraj


1 ответ


2

Проверьте адреса каналов чтения и записи.

Во-первых, значением по умолчанию является 0xE7E7E7E7E7 для канала 0 (RX_ADDR_P0) и 0xC2C2C2C2C2 для канала 1 (RX_ADDR_P1), см. технические данные. Убедитесь, что адрес передатчика (TX) совпадает с адресом приемника. (RX) адрес канала.

Во-вторых, не следует устанавливать адрес канала 0x0, даже если он является общим для TX и RX. Это примечание взято из таблицы данных:

Адреса, уровень которых меняется только один раз (т. е. 000FFFFFFF), часто можно обнаружить в шум и может дать ложное обнаружение, что может привести к увеличению частоты ошибок пакетов. Адреса как продолжение преамбулы (переключение высокого-низкого уровня) также увеличивает частоту ошибок пакетов

,

На самом деле адрес канала равен «0», который представляет собой строку с неявным нулевым ограничителем, что соответствует 30 00, что все равно плохо. Также я не знаю, как библиотека заполняет недостающие 3 байта адреса. В любом случае незнание настоящего адреса может оказаться хлопотным. Лучше попробуйте что-нибудь вроде «Link1» или что-нибудь из 5 символов., @Kwasmich