ESP32S3搭配Ebyte LoRa E22收发数据失败,求故障排查
Ebyte LoRa E22模块与ESP32S3通信故障排查
问题描述
使用ESP-IDF为搭载Ebyte LoRa E22模块的ESP32S3开发了简易收发程序,发射器日志始终显示发送成功:I (3026319) LoRa Tranmitter: Sent: Hello, LoRa!,但接收器仅输出等待日志:I (1008539) LoRa Receiver: Waiting....,始终无法接收数据包,核对引脚原理图并尝试多种引脚组合后仍未解决。
发射器代码
lora_transmitter.c
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #include "driver/gpio.h" #include "esp_log.h" #include "lora_transmitter.h" #include <string.h> #define TAG "LoRa Tranmitter" #define UART_NUM UART_NUM_1 #define PIN_TX 21 #define PIN_RX 14 #define BAUD_RATE 9600 #define BUF_SIZE (1024) void init_lora_module() { // Configure UART parameters const uart_config_t uart_config = { .baud_rate = BAUD_RATE, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_APB, }; // Install UART driver and set up UART ESP_ERROR_CHECK(uart_driver_install(UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, 0)); ESP_ERROR_CHECK(uart_param_config(UART_NUM, &uart_config)); ESP_ERROR_CHECK(uart_set_pin(UART_NUM, PIN_TX, PIN_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); ESP_LOGI(TAG, "LoRa module initialized"); } void lora_transmit_task(void *pvParameters) { const char *data_to_send = "Hello, LoRa!"; while (1) { // Send data over UART int len = uart_write_bytes(UART_NUM, data_to_send, strlen(data_to_send)); if (len > 0) { ESP_LOGI(TAG, "Sent: %s", data_to_send); } else { ESP_LOGE(TAG, "Failed to send data"); } vTaskDelay(pdMS_TO_TICKS(2000)); // Send data every 2 seconds } }
lora_transmitter.h
#ifndef LORA_SVC_H #define LORA_SVC_H #ifdef __cplusplus // for C++ calls (main.cpp) in this case extern "C" { #endif void lora_transmit_task(void *pvParameters); void init_lora_module(); #ifdef __cplusplus } #endif #endif // LORA_SVC_H
main.cpp
extern "C" void app_main(void) { // Initialize the LoRa module init_lora_module(); // Create a task to transmit data xTaskCreate(lora_transmit_task, "lora_transmit_task", 4096, NULL, 5, NULL); }
接收器代码(关键差异部分)
#define PIN_TX 4 #define PIN_RX 5 void lora_receive_task(void *pvParameters) { uint8_t rx_buffer[BUF_SIZE]; while (1) { // Read data from UART int len = uart_read_bytes(UART_NUM, rx_buffer, BUF_SIZE - 1, pdMS_TO_TICKS(100)); ESP_LOGI(TAG, "len is %d", len); if (len > 0) { rx_buffer[len] = '\0'; // Null-terminate the received data ESP_LOGI(TAG, "Received: %s", (char *)rx_buffer); } vTaskDelay(pdMS_TO_TICKS(2000)); ESP_LOGI(TAG, "Waiting...."); } }
原理图
接收器原理图



发射器原理图


问题原因及解决建议
核心问题点
- LoRa模块未配置关键参数:E22模块必须通过AT指令配置匹配的通信参数(地址、信道、波特率、工作模式等),当前代码仅初始化了ESP32的UART,未对LoRa模块进行配置,收发双方参数不匹配导致无法通信。
- 接收器UART读取逻辑不合理:
uart_read_bytes设置100ms超时后立刻延迟2000ms,期间LoRa模块收到的数据无法被及时读取,导致丢包。 - 模块工作模式未确认:E22有配置模式和透传模式,若未进入透传模式,无法直接通过UART收发数据。
- 引脚连接需二次确认:需确保ESP32的TX连接LoRa模块的RX,ESP32的RX连接LoRa模块的TX,交叉连接错误会导致数据无法传输。
具体解决步骤
- 添加LoRa模块AT配置代码:在
init_lora_module中添加AT指令配置,确保收发双方参数一致,示例如下(需根据模块手册调整参数):
// 初始化M0、M1引脚(假设连接到GPIO15、GPIO16) gpio_config_t io_conf = { .pin_bit_mask = (1ULL<<GPIO_NUM_15) | (1ULL<<GPIO_NUM_16), .mode = GPIO_MODE_OUTPUT, .pull_up_en = GPIO_PULLUP_DISABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .intr_type = GPIO_INTR_DISABLE }; gpio_config(&io_conf); // 进入配置模式 gpio_set_level(GPIO_NUM_15, 1); gpio_set_level(GPIO_NUM_16, 1); vTaskDelay(pdMS_TO_TICKS(100)); // 发送AT指令配置地址、信道 uart_write_bytes(UART_NUM, "AT+ADDRESS=0001\r\n", strlen("AT+ADDRESS=0001\r\n")); vTaskDelay(pdMS_TO_TICKS(100)); uart_write_bytes(UART_NUM, "AT+CHANNEL=003\r\n", strlen("AT+CHANNEL=003\r\n")); vTaskDelay(pdMS_TO_TICKS(100)); // 退出配置模式,进入透传模式 gpio_set_level(GPIO_NUM_15, 0); gpio_set_level(GPIO_NUM_16, 0); vTaskDelay(pdMS_TO_TICKS(100));
- 调整接收器读取逻辑:去掉不必要的2000ms延迟,或延长
uart_read_bytes的超时时间,改为持续监听:
void lora_receive_task(void *pvParameters) { uint8_t rx_buffer[BUF_SIZE]; while (1) { // 延长超时时间,持续等待数据 int len = uart_read_bytes(UART_NUM, rx_buffer, BUF_SIZE - 1, pdMS_TO_TICKS(1000)); ESP_LOGI(TAG, "len is %d", len); if (len > 0) { rx_buffer[len] = '\0'; ESP_LOGI(TAG, "Received: %s", (char *)rx_buffer); } // 移除不必要的2000ms延迟 // vTaskDelay(pdMS_TO_TICKS(2000)); // ESP_LOGI(TAG, "Waiting...."); } }
- 检查硬件电路:确认LoRa模块供电为稳定3.3V,天线正确连接,M0/M1引脚配置正确,AUX引脚可用于判断模块就绪状态。
- 验证UART连通性:可以先不使用LoRa模块,直接用杜邦线连接收发双方的ESP32 UART引脚(TX-RX交叉),测试纯UART通信是否正常,排除LoRa模块本身的问题。
内容的提问来源于stack exchange,提问作者Saeed isa
相关产品推荐
相关产品推荐

