发送端代码:
#include
#include
#include
RF24 radio(8, 10); // CE, CSN
const byte address[6] = "00001";
int greenPin = 6;//我连了一个LED,用于监测发送端数据是否发出去了。
float greenLEDVal;
void setup() {
greenLEDVal = 5.;
pinMode(greenPin, OUTPUT);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
radio.setRetries(15, 15);
radio.stopListening();
}
void loop() {
bool txan;
const char text[4] = "Hel";
txan = radio.write(&text, sizeof(text));
delay(1000);
if(txan)
analogWrite(greenPin, greenLEDVal);
else
analogWrite(greenPin, 0.);
}
接收端代码:
#include
#include
#include
RF24 radio(8, 10); // CE, CSN
const byte address[6] = "00002";
const char text[4];
void setup() {
Serial.begin(115200);
radio.begin();
radio.setPayloadSize(sizeof(text));
radio.openReadingPipe(1, address);
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
radio.setRetries(15, 15);
radio.startListening();
}
void loop() {
uint8_t pipeNum;
if (radio.available(&pipeNum)) {
Serial.print("Received data on pipe ");
Serial.println(pipeNum);
uint8_t bytes = radio.getPayloadSize();
radio.read(&text, bytes);
Serial.println(text);
// radio.flush_rx();
}
}
运行结果就是发送端LED灯亮着,接收端串口监视器一直无规律滚动Received data on pipe 0/1/3/4,此外每2行中间还有1行空行。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
问题可能是您的接收端代码没有正确地接收和处理数据。在接收数据之前,您应该先声明一个缓冲区来存储接收到的数据。在您的接收端代码中,您没有声明一个缓冲区来存储接收到的数据,而是直接使用了一个未初始化的字符数组 text。此外,您需要在接收到数据后将缓冲区转换为字符串,并输出到串口监视器中。
以下是修改后的接收端代码:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 10); // CE, CSN
const byte address[6] = "00002";
char text[32];
void setup() {
Serial.begin(115200);
radio.begin();
radio.setPayloadSize(sizeof(text));
radio.openReadingPipe(1, address);
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
radio.setRetries(15, 15);
radio.startListening();
}
void loop() {
uint8_t pipeNum;
if (radio.available(&pipeNum)) {
Serial.print("Received data on pipe ");
Serial.println(pipeNum);
uint8_t bytes = radio.getPayloadSize();
radio.read(&text, bytes);
text[bytes] = '\0'; // Add null terminator to convert buffer to string
Serial.println(text);
}
}
请注意,我将字符数组 text 的大小更改为 32,以便容纳可能更长的消息。我还添加了一个空字符到缓冲区的末尾,以便在输出到串口监视器时将其转换为字符串。
您应该尝试重新编译和上传修改后的接收端代码,并确保发送端和接收端使用相同的地址。如果问题仍然存在,请检查您的硬件连接和配置,以确保所有设置正确。
sizeof 改为strlen
参考gpt和自己的思路,在接收端代码中,您定义了一个名为“text”的常量字符数组,但未为其分配任何值,因此无法接收到从发送端发送的数据。您需要为接收端定义一个变量来存储接收到的数据,并将其传递给radio.read函数。同时,您可以在接收数据之前清除接收缓冲区,以确保不会收到之前发送的任何数据。以下是修改过的接收端代码:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 10); // CE, CSN
const byte address[6] = "00002";
char receivedData[4];
void setup() {
Serial.begin(115200);
radio.begin();
radio.setPayloadSize(sizeof(receivedData));
radio.openReadingPipe(1, address);
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_250KBPS);
radio.setRetries(15, 15);
radio.startListening();
}
void loop() {
uint8_t pipeNum;
if (radio.available(&pipeNum)) {
Serial.print("Received data on pipe ");
Serial.println(pipeNum);
radio.read(&receivedData, sizeof(receivedData));
Serial.println(receivedData);
radio.flush_rx();
}
}
此外,您可以尝试将发送数据的文本长度增加到5,以便它可以正确地转换为以null结尾的C字符串。此时您需要将接收端代码中的数组大小更改为5。
检查一下你的nRF24L01模块,确保你使用的nRF24L01模块正常工作。可以使用其他nRF24L01模块测试你的代码,或者使用示波器检查nRF24L01模块的信号输出。
不知道你这个问题是否已经解决, 如果还没有解决的话:以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,你发送端的代码中定义的地址为“00001”,而接收端的代码中定义的地址为“00002”,这两个地址不一致,需要保持一致。确保地址一致后,可以尝试以下方法:
检查硬件连接是否正确,需要确认 nRF24L01 模块的 VCC、GND、CE、CSN、MOSI、MISO 和 SCK 引脚是否正确连接到 Arduino 的对应引脚上。
检查电源是否稳定,nRF24L01 模块需要稳定的 3.3V 电压供应。如果电源不稳定,可能会导致通信异常或失败。
检查 nRF24L01 模块是否已正确初始化。发送端需要设置为写模式,接收端需要设置为读模式,并设置接收管道。
检查设置的数据速率、信号强度以及重试次数是否合适。建议在初始阶段将数据速率、信号强度和重试次数设为较低的值。
在接收数据时,建议在每次接收数据后调用 flush_rx() 函数清空缓冲区,以避免接收到重复数据。这里你可以尝试移除注释的语句 // radio.flush_rx();
。
下面是稍微修改后的代码,你可以参考一下:
发送端:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 10); // CE, CSN
const byte address[6] = "00001";
int greenPin = 6;
float greenLEDVal;
void setup() {
greenLEDVal = 5.;
pinMode(greenPin, OUTPUT);
radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.setDataRate(RF24_250KBPS);
radio.setChannel(76);
radio.setRetries(15, 15);
radio.openWritingPipe(address);
radio.stopListening();
}
void loop() {
bool txan;
const char text[] = "Hello";
txan = radio.write(&text, sizeof(text));
delay(1000);
if (txan) {
analogWrite(greenPin, greenLEDVal);
} else {
analogWrite(greenPin, 0.);
}
}
接收端:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(8, 10); // CE, CSN
const byte address[6] = "00001";
const int text_size = 32;
char text[text_size];
void setup() {
Serial.begin(115200);
radio.begin();
radio.setPALevel(RF24_PA_LOW);
radio.setDataRate(RF24_250KBPS);
radio.setChannel(76);
radio.setRetries(15, 15);
radio.setPayloadSize(text_size);
radio.openReadingPipe(1, address);
radio.startListening();
}
void loop() {
if (radio.available()) {
uint8_t bytes = radio.getPayloadSize();
radio.read(&text, bytes);
Serial.println(text);
radio.flush_rx();
}
}
需要注意的是,两个代码中的 pipe 地址应该都设置成一样的,这里我们都设置为 "00001"
。另外,建议将 nRF24L01 模块的 PA 引脚接收低电平,以降低功耗。
希望这些解答能够帮到你。
如果我的回答解决了您的问题,请采纳!