avenlee2023 2024-03-09 09:11 采纳率: 3.8%
浏览 519

ESP32 串口0下载及通讯问题

纯白刚接触ESP32,用的S3-WROOM-1模组,环境根据教程用的VSCode+IDF,有个问题想请教一下:
默认使用串口0下载,那么我该怎么使用这个串口0来做通讯呢?
另外一个是ESP_LOG是不是其实就是用到这个串口来发送打印信息的?
可能这个问题很蠢,谢谢

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-09 09:12
    关注

    引自免费微信小程序:皆我百晓生

    在ESP32中,串口0(UART0)默认被用作与电脑的通信接口来进行固件下载和调试输出。然而,你依然可以配置ESP32以在同一串口上实现数据通讯,但需要注意的是,在下载和调试阶段串口会被占用,因此在实际应用中可能需要对串口功能进行切换或者使用其他的串口(如UART1或UART2)。

    关于你的问题:

    1. 要在串口0上实现通讯,你需要在ESP32 IDF项目中重新配置串口,并且在不干扰下载和调试的前提下管理好串口的使用状态。以下是一个基本的示例代码来初始化和使用UART0进行数据传输:
    #include "driver/uart.h"
    
    // 初始化UART0, 波特率设置为115200
    void init_uart0() {
        uart_config_t uart_config = {
            .baud_rate = 115200,
            .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,
        };
        // 配置并安装UART驱动
        ESP_ERROR_CHECK(uart_driver_install(UART_NUM_0, 256, 0, 0, NULL, 0));
        // 配置UART参数
        ESP_ERROR_CHECK(uart_param_config(UART_NUM_0, &uart_config));
    }
    
    // 使用UART0发送数据
    void uart0_send(const char* data) {
        size_t len = strlen(data);
        ESP_ERROR_CHECK(uart_write_bytes(UART_NUM_0, (const char*)data, len));
    }
    
    // 接收UART0数据
    void uart0_recv_task(void* arg) {
        static const size_t BUFFER_SIZE = 256;
        uint8_t* data = (uint8_t*)malloc(BUFFER_SIZE);
        size_t rx_size;
    
        while (1) {
            if (uart_read_bytes(UART_NUM_0, data, BUFFER_SIZE, portMAX_DELAY) > 0) {
                rx_size = uart_get_buffered_data_len(UART_NUM_0);
                // 处理接收到的数据...
            }
        }
    
        free(data);
        vTaskDelete(NULL);
    }
    
    void app_main() {
        init_uart0();
    
        // 创建接收任务
        xTaskCreate(uart0_recv_task, "uart0_recv_task", 4096, NULL, 5, NULL);
    
        // 发送测试数据
        uart0_send("Hello from UART0!\r\n");
    
        // 其他应用代码...
    }
    
    1. 是的,ESP_LOG确实使用了串口来发送打印信息。默认情况下,ESP32的ESP_LOG会通过UART0输出日志信息,当然你也可以通过ESP-IDF配置文件(sdkconfig.defaults 或 sdkconfig)修改日志输出到其他串口或其他输出设备,例如JTAG调试器或网络接口等。

    若要同时兼顾下载、调试和通讯,建议考虑将日志输出重定向至其他串口,并确保在通讯时暂停日志输出,以免影响数据通讯的稳定性。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月9日