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

ESP-32与LoRa RA-02模块收发循环异常问题求助

ESP32 + RA-02 LoRa模块:节点回复无法接收的问题排查与解决

问题描述

我拥有两套ESP-32与Ra-02 LoRa模块,希望实现节点间消息发送并获取回复确认。目前Node1发送的消息可到达Node2,但Node2向Node1的回复无法被接收,请问我遗漏了什么配置?

Node1 原始代码

#include <SPI.h>
#include <LoRa.h>

#define SCK 18
#define MISO 19
#define MOSI 23
#define NSS 5
#define RESET 14
#define DIO0 26

void setup() {
  Serial.begin(115200);
  while (!Serial);

  LoRa.setPins(NSS, RESET, DIO0);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  Serial.println("LoRa Transmitter");
}

void loop() {
  String message = "Hello";
  Serial.print("Sending: ");
  Serial.println(message);
  
  LoRa.beginPacket();
  LoRa.print(message);
  LoRa.endPacket();

  delay(100);

  // Wait for acknowledgment
  unsigned long startMillis = millis();
  unsigned long timeout = 2000; // 2 seconds timeout
  String response = "";

  LoRa.idle(); // Ensure the module is in idle state before entering the loop
  while (millis() - startMillis < timeout) {
    int packetSize = LoRa.parsePacket();
    if (packetSize) {
      while (LoRa.available()) {
        response += (char)LoRa.read();
      }
      break; // Exit the loop once a packet is received
    }
  }

  if (response != "") {
    Serial.print("Received response: ");
    Serial.println(response);
  } else {
    Serial.println("No response received");
  }

  delay(5000);
}

Node2 原始代码

#include <SPI.h>
#include <LoRa.h>

#define SCK 18
#define MISO 19
#define MOSI 23
#define NSS 5
#define RESET 14
#define DIO0 26

void setup() {
  Serial.begin(115200);
  while (!Serial);

  LoRa.setPins(NSS, RESET, DIO0);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  Serial.println("LoRa Receiver");
}

void loop() {
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    String incoming = "";
    while (LoRa.available()) {
      incoming += (char)LoRa.read();
    }

    Serial.print("Received: ");
    Serial.println(incoming);

    // Send acknowledgment
    String response = incoming + ":ack";
    Serial.print("Sending: ");
    Serial.println(response);
    
    LoRa.beginPacket();
    LoRa.print(response);
    LoRa.endPacket();
  }
}

问题原因与解决方案

1. 未统一LoRa核心通信参数

LoRa模块的双向通信必须保证所有参数完全一致,仅设置频率不足以确保兼容。不同版本的LoRa库默认参数可能存在差异,导致Node2的回复无法被Node1解调。

修复:在两个节点的setup()中添加统一参数配置

在LoRa.begin(433E6)之后添加以下代码(两个节点必须完全相同):

// 统一LoRa通信参数,确保节点间兼容
LoRa.setSpreadingFactor(7);    // 扩频因子:6-12,数值越高距离越远、速率越低
LoRa.setSignalBandwidth(125E3); // 带宽:可选125E3/250E3/500E3
LoRa.setCodingRate4(5);        // 编码率:5-8
LoRa.setTxPower(17);           // RA-02最大支持20dBm,根据实际场景调整

2. Node1的接收逻辑冗余且干扰模式切换

Node1发送完数据包后调用LoRa.idle()是冗余操作,LoRa.parsePacket()会自动将模块切换到接收模式,额外的idle()可能导致模块无法及时进入接收状态。

修复:简化Node1的接收逻辑

修改Node1中等待回复的代码段:

// Wait for acknowledgment
unsigned long startMillis = millis();
unsigned long timeout = 2000; // 2 seconds timeout
String response = "";

// 移除LoRa.idle(),parsePacket会自动切换到接收模式
while (millis() - startMillis < timeout) {
  int packetSize = LoRa.parsePacket();
  if (packetSize > 0) {
    response = ""; // 清空缓冲区,避免残留旧数据
    while (LoRa.available()) {
      response += (char)LoRa.read();
    }
    Serial.print("Received response: ");
    Serial.println(response);
    break;
  }
}

if (response == "") {
  Serial.println("No response received");
}

3. 可选:优化Node2发送后的状态

Node2发送回复后,可以强制模块回到接收模式,避免影响后续数据包接收:
在Node2的LoRa.endPacket()之后添加:

LoRa.receive(); // 强制切换回接收模式

4. 硬件检查

  • 确认两个RA-02模块都正确连接了外接天线,无天线会导致信号衰减严重,无法完成双向通信。
  • 核对ESP32与RA-02的SPI引脚接线是否与代码中定义的一致(SCK、MISO、MOSI、NSS、RESET、DIO0)。

修改后的完整代码示例

Node1 修改后代码

#include <SPI.h>
#include <LoRa.h>

#define SCK 18
#define MISO 19
#define MOSI 23
#define NSS 5
#define RESET 14
#define DIO0 26

void setup() {
  Serial.begin(115200);
  while (!Serial);

  LoRa.setPins(NSS, RESET, DIO0);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  // 统一LoRa通信参数
  LoRa.setSpreadingFactor(7);
  LoRa.setSignalBandwidth(125E3);
  LoRa.setCodingRate4(5);
  LoRa.setTxPower(17);

  Serial.println("LoRa Transmitter");
}

void loop() {
  String message = "Hello";
  Serial.print("Sending: ");
  Serial.println(message);
  
  LoRa.beginPacket();
  LoRa.print(message);
  LoRa.endPacket();

  delay(100);

  // Wait for acknowledgment
  unsigned long startMillis = millis();
  unsigned long timeout = 2000;
  String response = "";

  while (millis() - startMillis < timeout) {
    int packetSize = LoRa.parsePacket();
    if (packetSize > 0) {
      response = "";
      while (LoRa.available()) {
        response += (char)LoRa.read();
      }
      Serial.print("Received response: ");
      Serial.println(response);
      break;
    }
  }

  if (response == "") {
    Serial.println("No response received");
  }

  delay(5000);
}

Node2 修改后代码

#include <SPI.h>
#include <LoRa.h>

#define SCK 18
#define MISO 19
#define MOSI 23
#define NSS 5
#define RESET 14
#define DIO0 26

void setup() {
  Serial.begin(115200);
  while (!Serial);

  LoRa.setPins(NSS, RESET, DIO0);
  if (!LoRa.begin(433E6)) {
    Serial.println("Starting LoRa failed!");
    while (1);
  }

  // 统一LoRa通信参数,与Node1完全一致
  LoRa.setSpreadingFactor(7);
  LoRa.setSignalBandwidth(125E3);
  LoRa.setCodingRate4(5);
  LoRa.setTxPower(17);

  Serial.println("LoRa Receiver");
}

void loop() {
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    String incoming = "";
    while (LoRa.available()) {
      incoming += (char)LoRa.read();
    }

    Serial.print("Received: ");
    Serial.println(incoming);

    // Send acknowledgment
    String response = incoming + ":ack";
    Serial.print("Sending: ");
    Serial.println(response);
    
    LoRa.beginPacket();
    LoRa.print(response);
    LoRa.endPacket();
    LoRa.receive(); // 强制回到接收模式
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:28:17