Arduino连接nRF24L01,接收端串口监视器一直滚动但就是没数据,咋回事呢?

发送端代码:


#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行空行。

img

该回答引用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”,这两个地址不一致,需要保持一致。确保地址一致后,可以尝试以下方法:

  1. 检查硬件连接是否正确,需要确认 nRF24L01 模块的 VCC、GND、CE、CSN、MOSI、MISO 和 SCK 引脚是否正确连接到 Arduino 的对应引脚上。

  2. 检查电源是否稳定,nRF24L01 模块需要稳定的 3.3V 电压供应。如果电源不稳定,可能会导致通信异常或失败。

  3. 检查 nRF24L01 模块是否已正确初始化。发送端需要设置为写模式,接收端需要设置为读模式,并设置接收管道。

  4. 检查设置的数据速率、信号强度以及重试次数是否合适。建议在初始阶段将数据速率、信号强度和重试次数设为较低的值。

  5. 在接收数据时,建议在每次接收数据后调用 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 引脚接收低电平,以降低功耗。

希望这些解答能够帮到你。
如果我的回答解决了您的问题,请采纳!