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

ESP32如何实现单个字符接收时触发UART中断?

ESP32实现单字符触发UART中断的方法

完全可以实现单字符接收即触发UART中断,以下是简便的实现方式:

核心思路

通过配置UART接收FIFO的触发阈值为1,让硬件每收到1个字符就触发中断/事件,再通过事件驱动或直接中断回调处理字符。

具体实现步骤

1. 基础UART初始化

先完成UART的波特率、引脚、缓冲区等基础配置:

#include "driver/uart.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"

#define UART_PORT UART_NUM_0
#define RX_BUF_SIZE 1024
#define TX_BUF_SIZE 1024

static QueueHandle_t uart_queue;

void uart_basic_init() {
    uart_config_t uart_cfg = {
        .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_param_config(UART_PORT, &uart_cfg);
    uart_set_pin(UART_PORT, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    // 安装驱动时指定事件队列长度,用于接收UART事件
    uart_driver_install(UART_PORT, RX_BUF_SIZE * 2, TX_BUF_SIZE, 10, &uart_queue, 0);
}

2. 设置单字符触发阈值

配置UART接收FIFO的触发阈值为1,确保每收到1个字符就触发事件:

// 在初始化函数中添加此配置
uart_set_rx_full_threshold(UART_PORT, 1);

3. 事件驱动处理单字符

创建事件处理任务,接收并处理每一个触发的单字符事件:

void uart_char_handle_task(void *arg) {
    uart_event_t event;
    uint8_t recv_char[1] = {0};
    while (1) {
        if (xQueueReceive(uart_queue, &event, portMAX_DELAY)) {
            switch (event.type) {
                case UART_DATA:
                    // 读取收到的单个字符
                    uart_read_bytes(UART_PORT, recv_char, 1, portMAX_DELAY);
                    // 这里添加你的字符处理逻辑,比如打印或解析
                    printf("Received single char: %c\n", recv_char[0]);
                    break;
                // 可按需处理其他UART事件(如错误、溢出等)
                default:
                    break;
            }
        }
    }
    vTaskDelete(NULL);
}

// 在初始化函数末尾添加任务创建
xTaskCreate(uart_char_handle_task, "uart_char_task", 2048, NULL, 10, NULL);

注意事项

  • 事件驱动方式是ESP-IDF推荐的用法,避免直接在ISR中处理复杂逻辑,减少系统阻塞风险。
  • 如果需要更底层的中断处理,可以使用uart_isr_register()注册自定义中断服务函数,但需保证ISR代码极简,仅做数据转发到队列等轻量操作。

内容的提问来源于stack exchange,提问作者David Hasko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:52:34