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
相关产品推荐
相关产品推荐

