Проблемы с полученными данными от NRF24L01

Я использую NRF24L01 для беспроводной связи. Мой код передатчика:

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

//int msg[1];
RF24 radio(2,9); // CSN, CE
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(){
        Serial.begin(9600);
        radio.begin();
        radio.openWritingPipe(pipe);
        radio.setPALevel(RF24_PA_MIN);
        radio.stopListening();
        Serial.println("################## Set up complete ######################");
}

void loop(){
        const char data[] = "hello world!";
        radio.write(&data, sizeof(data));
        Serial.println("message sent");
        delay(1000);
}

Мой код получателя:

#include "nRF24L01.h"
#include "RF24.h"
#include "SPI.h"

RF24 radio(8,7); // (CSN, CE)
const uint64_t pipe = 0xE8E8F0F0E1LL;

void setup(){
        Serial.begin(9600);
        radio.begin(); // Start the NRF24L01
        radio.openReadingPipe(1,pipe); // Get NRF24L01 ready to receive
        Serial.print("pipe open ... ");
        radio.setPALevel(RF24_PA_MIN);
        radio.startListening(); // Listen to see if information received
        Serial.println("Listening: ready to recieve ...");
}

void loop(){
        Serial.print("checking for radio signal ... ");
        if (radio.available()){
                Serial.print("| radio available | ");
                char data[32] = ""; // delcare data
                radio.read(&data, sizeof(data)); // read data from transmitter
                Serial.println(data);   // print data to serial
        }
        else {
                Serial.println("   Nothing");   // print if nothing read
        }
        delay(500);
}

когда передатчик отправляет свои данные, приемник должен напечатать:

"checking for radio signal | radio available | "hello world!"

или когда передатчик не отправляет данные, приемник печатает:

checking for radio signal | nothing

однако получатель печатает:

b'checking for radio signal ...    Nothing\r\n'
b'checking for radio signal ...    Nothing\r\n'
b'checking for radio signal ... | radio available | \xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x18\x03?\x01fpipe open ... \r\n'
b'checking for radio signal ... | radio available | \xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x18\x03?\x01fpipe open ... \r\n'
b'checking for radio signal ...    Nothing\r\n'
b'checking for radio signal ...    Nothing\r\n'

Кто-нибудь знает, почему я не вижу «привет, мир», а вместо этого получаю нечетные строки символов?

ПРИМЕЧАНИЕ. Я также получаю тот же результат, даже когда передатчик выключен.


person Ramces Gonzalez    schedule 22.01.2019    source источник
comment
Не относящееся к теме примечание: с radio.write(&data, sizeof(data)), который &data будет работать, это семантически неправильно. Вы должны передать указатель на первый элемент (т.е. &data[0]), на который распадается обычный data. Разница между &data и &data[0] заключается в типах: &data относится к типу const char (*)[13], а &data[0] относится к типу const char *. Примеры, говорящие &data, неверны.   -  person Some programmer dude    schedule 22.01.2019
comment
спасибо за ввод, я изменил строку radio.read(&data, sizeof(data)); на radio.read(&data[0], sizeof(data[0])); и теперь я получаю вывод b'checking for radio signal ... | radio available | \xff\r\n'   -  person Ramces Gonzalez    schedule 22.01.2019
comment
Теперь вы указываете неправильный тип оператора sizeof, так как data[0] — это один байт. Вам нужно передать указатель на первый элемент (указатель на data[0] , то есть обычный data), а затем указать размер всего массива (который равен sizeof data).   -  person Some programmer dude    schedule 22.01.2019
comment
спасибо, попробую использовать radio.read(&data[0], sizeof(data));   -  person Ramces Gonzalez    schedule 23.01.2019
comment
Привет, какой-то программист, я попробовал, и я все еще получаю radio signal ... | radio available | \xff\r\n', я не уверен, откуда берется \xff\xff\xff .... но опять же, я даже не уверен, что делает radio.available(), я предполагаю, что это значит есть сигнал   -  person Ramces Gonzalez    schedule 23.01.2019
comment
Как вы ожидаете, что Serial.printlen(data); узнает, сколько байтов нужно напечатать?   -  person David Schwartz    schedule 23.12.2019


Ответы (1)


В коде приема тоже есть логическая ошибка. Когда вы сразу печатаете «сообщение отправлено» без каких-либо условий, оно выполняется каждый раз, независимо от того, было ли сообщение отправлено или потеряно. Вместо этого вы должны использовать

if(radio.write(&data, sizeof(data))){
    Serial.println("Message Sent");
}else{
    Serial.println("Message not sent");
}

потому что radio.write возвращает TRUE, если данные достигли приемника. в противном случае он возвращает FALSE, указывая на то, что данные были потеряны. Сделав это, вы поймете, что сообщение не только передается. Также CE упоминается перед CSN в радио RF24 (CE, CSN).

person Krishna Ojha    schedule 23.12.2019