MKR WAN 1300与WEMOS D1 mini ESP32的LoRa通信故障排查求助
问题排查与解决方案
核心问题分析
- 库协议不兼容:发送端使用
LoRa库(基于SPI通信),接收端却误用RH_RF95库并尝试通过UART(Serial2)驱动模块,两者底层通信逻辑完全不匹配。 - RH_RF95初始化错误:
RH_RF95库是为SPI连接的SX127x系列LoRa模块设计的,不能直接传入UART对象作为初始化参数。 - 代码配置混乱:接收端未正确初始化SPI引脚,还错误打印了默认串口的RX/TX引脚(
String(TX)/String(RX)),而非实际使用的RXD2/TXD2。
修复方案
方案1:接收端统一使用LoRa库(SPI通信)
如果你的Grove LoRa模块支持SPI通信,直接和发送端用相同的库,修正代码如下:
接收端修正代码
#include <Arduino.h> #include <SPI.h> #include <LoRa.h> // WEMOS D1 mini ESP32默认SPI引脚配置,可根据实际连线调整 #define LORA_SS 18 #define LORA_RST 14 #define LORA_DIO0 26 void setup() { Serial.begin(115200); while (!Serial); // 初始化LoRa模块引脚与频段 LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0); if (!LoRa.begin(868E6)) { Serial.println("LoRa初始化失败!"); while (1); } Serial.println("LoRa接收端就绪"); } void loop() { // 检测是否有数据包到来 int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.println("收到数据包:"); // 读取数据包内容 while (LoRa.available()) { String message = LoRa.readString(); Serial.print("内容:"); Serial.println(message); } // 打印信号参数(可选) Serial.print("信号强度(RSSI): "); Serial.println(LoRa.packetRssi()); Serial.print("信噪比(Snr): "); Serial.println(LoRa.packetSnr()); Serial.println("-------------------"); } else { Serial.println("未收到数据包"); } delay(5000); }
方案2:针对UART型LoRa模块调整代码
如果你的Grove LoRa模块是UART通信版本(如E32系列),则无需SPI类LoRa库,直接通过串口收发:
UART接收端示例代码
#include <Arduino.h> #define RXD2 16 #define TXD2 17 void setup() { Serial.begin(115200); Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); Serial.print("UART LoRa接收端就绪 | RX引脚:"); Serial.println(RXD2); Serial.print("TX引脚:"); Serial.println(TXD2); } void loop() { if (Serial2.available()) { String received = Serial2.readStringUntil('\n'); Serial.print("收到数据:"); Serial.println(received); } else { Serial.println("未收到UART数据"); } delay(5000); }
额外注意事项
- 确保两端LoRa模块的频段(868MHz)、扩频因子、带宽、编码率等参数完全一致
- SPI模块需正确连接SCK、MISO、MOSI、SS、RST、DIO0引脚;UART模块需交叉连线(发送端TX接接收端RX,接收端TX接发送端RX)
- 测试时尽量缩短模块距离,避开信号干扰源
内容的提问来源于stack exchange,提问作者Nazanin Ghasemi
相关产品推荐
相关产品推荐

