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

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....");
    }
}

原理图

接收器原理图

接收器原理图1
接收器原理图2
接收器原理图3

发射器原理图

发射器原理图1
发射器原理图2

问题原因及解决建议

核心问题点

  1. LoRa模块未配置关键参数:E22模块必须通过AT指令配置匹配的通信参数(地址、信道、波特率、工作模式等),当前代码仅初始化了ESP32的UART,未对LoRa模块进行配置,收发双方参数不匹配导致无法通信。
  2. 接收器UART读取逻辑不合理:uart_read_bytes设置100ms超时后立刻延迟2000ms,期间LoRa模块收到的数据无法被及时读取,导致丢包。
  3. 模块工作模式未确认:E22有配置模式和透传模式,若未进入透传模式,无法直接通过UART收发数据。
  4. 引脚连接需二次确认:需确保ESP32的TX连接LoRa模块的RX,ESP32的RX连接LoRa模块的TX,交叉连接错误会导致数据无法传输。

具体解决步骤

  1. 添加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));
  1. 调整接收器读取逻辑:去掉不必要的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....");
    }
}
  1. 检查硬件电路:确认LoRa模块供电为稳定3.3V,天线正确连接,M0/M1引脚配置正确,AUX引脚可用于判断模块就绪状态。
  2. 验证UART连通性:可以先不使用LoRa模块,直接用杜邦线连接收发双方的ESP32 UART引脚(TX-RX交叉),测试纯UART通信是否正常,排除LoRa模块本身的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:15:56