uart

YIN 发布于 2025-05-14 278 次阅读


使用的库

  • "driver/uart.h"
  • "esp_log.h"
  • "esp_err.h"

初始化

  • uart_param_config() 函数配置uart信息
    使用UART0请留意是否被终端占用
  • uart_set_pin() 设置GPIO
    不用的接口赋值 -1
  • uart_driver_install() 设置接受队列,发送与接收缓冲区大小
    发送缓冲区可以为0,发送时函数阻塞。若不为零,必须满足缓冲区大小大于等于UART_HW_FIFO_LEN
    接收缓冲区大小必须大于等于UART_HW_FIFO_LEN
  • uart_set_rx_timeout() 设置超时时间

示例

C
void uart1Init()
{
    uart_config_t UartConfig = {
        .baud_rate = baudrate, /*TODO 自行确认波特率*/
        .data_bits = UART_DATA_8_BITS,
        .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS,
        //.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .rx_flow_ctrl_thresh = 1,
    };
    ESP_ERROR_CHECK(uart_param_config(UART_NUM_1, &UartConfig));
    uart_set_pin(UART_NUM_1, UART1_TXD, UART1_RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);/*TODO 自行更换GPIO绑定*/
    uart_driver_install(UART_NUM_1, 512, 512, 10, &Uart1Queue, 0);/*TODO 自行更换队列句柄*/
    uart_set_rx_timeout(UART_NUM_1,4);
}

发送

使用uart_write_bytes()发送数据

示例

C
uart_write_bytes(UART_NUM_1, (const char *)data, length);

接收

  • 使用xQueueReceive()接收队列信息,并使用uart_event_t类型变量接住
  • 判断信息类型,若为UART_DATA则接收

示例

C
void uart1EventTask()
{
    uart_event_t UartEvent;
    uint8_t RecvBuf[520];
    size_t RecvLen = 0;
    while (true) {
        if (xQueueReceive(Uart1Queue,&UartEvent,portMAX_DELAY)) {
            switch (UartEvent.type) {
                case UART_DATA:
                    uart_get_buffered_data_len(UART_NUM_1,&RecvLen);
                    if (RecvLen > 0) {
                        RecvLen = uart_read_bytes(UART_NUM_1,RecvBuf,RecvLen,0);
                        RecvBuf[RecvLen] = 0;
                        /*TODO 接收后的动作*/
                    }
                    break;
                    default:
                    break;
            }
        }
    }
}

此作者没有提供个人介绍。
最后更新于 2025-05-16