You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

nRF24L01模块无法接收ACK数据包问题求助

nRF24L01双向传输器ACK数据包接收失败问题

我用两个nRF24L01模块和Arduino Uno制作双向传输器,发送端能正常发送数据,但无法接收ACK数据包。开启发送端的ACK数据包功能会导致传输失效,调整数据包发送管道也未解决问题,恳请提供帮助。

发送端(TX)代码

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(0, true);
  radio.openWritingPipe(address);
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
    const char text[] = "Hi";
    const char data[] = "";
    radio.write(&text, sizeof(text));
    delay(100);
    if (radio.isAckPayloadAvailable() == true) {
      radio.read(&data, sizeof(data));
      Serial.print(data);
    }
    else {
      Serial.print("Not recieved");
      
    }
}

接收端(RX)代码

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


RF24 radio(7, 8); // CE, CSN


const byte address[6] = "00001";



void setup() {
  radio.setAutoAck(0, true);
  radio.enableAckPayload();
  radio.enableDynamicPayloads();
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();

}

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
    const char data[] = "got";
    radio.writeAckPayload(3, &data, sizeof(data));
  }
}

问题排查与修复方案

1. 管道号不匹配

nRF24L01的ACK Payload与接收管道绑定,发送端的读取管道要和接收端的接收管道对应,且管道0默认与写管道关联,更适合处理ACK交互:

  • 接收端将openReadingPipe(1, address)改为openReadingPipe(0, address)
  • 接收端将writeAckPayload(3, &data, sizeof(data))改为writeAckPayload(0, &data, sizeof(data))

2. 发送端未启用必要功能

发送端要接收ACK Payload,必须启用动态负载和ACK Payload支持,否则无法处理可变长度的ACK数据,甚至导致传输失效:
在发送端setup()中添加:

radio.enableAckPayload();
radio.enableDynamicPayloads();

3. 缓冲区变量错误

发送端中const char data[] = ""是常量且长度仅为1,无法存储"got"这类数据,修改为可写入的缓冲区:

char data[32] = "";

4. 优化发送与等待逻辑

添加radio.write()的返回值判断,排查发送失败情况;缩短延迟避免ACK等待超时:

bool sendOk = radio.write(&text, sizeof(text));
if(!sendOk){
  Serial.println("Send failed");
  delay(100);
  return;
}
delay(10);

修改后的完整代码

发送端(TX)代码

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(0, true);
  radio.enableAckPayload();
  radio.enableDynamicPayloads();
  radio.openWritingPipe(address);
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
    const char text[] = "Hi";
    char data[32] = "";
    bool sendOk = radio.write(&text, sizeof(text));
    if(!sendOk){
      Serial.println("Send failed");
      delay(100);
      return;
    }
    delay(10);
    if (radio.isAckPayloadAvailable()) {
      radio.read(&data, sizeof(data));
      Serial.print("Received ACK: ");
      Serial.println(data);
    }
    else {
      Serial.println("No ACK payload received");
    }
    delay(90);
}

接收端(RX)代码

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

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(0, true);
  radio.enableAckPayload();
  radio.enableDynamicPayloads();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println("Received: " + String(text));
    const char data[] = "got";
    radio.writeAckPayload(0, &data, sizeof(data));
  }
}

内容的提问来源于stack exchange,提问作者ELBR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:35:07