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
相关产品推荐
相关产品推荐

