Я использую 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'
Кто-нибудь знает, почему я не вижу «привет, мир», а вместо этого получаю нечетные строки символов?
ПРИМЕЧАНИЕ. Я также получаю тот же результат, даже когда передатчик выключен.
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.2019radio.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.2019sizeof
, так какdata[0]
— это один байт. Вам нужно передать указатель на первый элемент (указатель наdata[0]
, то есть обычныйdata
), а затем указать размер всего массива (который равенsizeof data
). - person Some programmer dude   schedule 22.01.2019radio.read(&data[0], sizeof(data));
- person Ramces Gonzalez   schedule 23.01.2019radio signal ... | radio available | \xff\r\n'
, я не уверен, откуда берется \xff\xff\xff .... но опять же, я даже не уверен, что делаетradio.available()
, я предполагаю, что это значит есть сигнал - person Ramces Gonzalez   schedule 23.01.2019Serial.printlen(data);
узнает, сколько байтов нужно напечатать? - person David Schwartz   schedule 23.12.2019