ESP32外设-2.UART入门
说明:
- 本文档由DuRuofu撰写,由DuRuofu负责解释及执行。
- 本文档介绍ESP32外设-UART的基本使用
修订历史:
文档名称 | 版本 | 作者 | 时间 | 备注 |
---|---|---|---|---|
ESP32外设-UART入门 | v1.0.0 | DuRuofu | 2024-03-03 | 首次建立 |
ESP32外设-UART入门
一、UART介绍
通用异步接收器/发送器 (UART) 属于一种硬件功能,通过使用 RS232、RS422、RS485 等常见异步串行通信接口来处理通信时序要求和数据帧。UART 是实现不同设备之间全双工或半双工数据交换的一种常用且经济的方式。
ESP32 芯片有 3 个 UART 控制器(也称为端口),每个控制器都有一组相同的寄存器以简化编程并提高灵活性。
每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。所有具备完整功能的 UART 控制器都能与不同制造商的 UART 设备兼容,并且支持红外数据协会 (IrDA) 定义的标准协议。
二、功能概述
基本编程流程分为以下几个步骤:
- 设置通信参数 - 设置波特率、数据位、停止位等
- 设置通信管脚 - 分配连接设备的管脚
- 安装驱动程序 - 为 UART 驱动程序分配 ESP32 资源
- 运行 UART 通信 - 发送/接收数据
- 使用中断 - 触发特定通信事件的中断
- 删除驱动程序 - 如无需 UART 通信,则释放已分配的资源
步骤 1 到 3 为配置阶段,步骤 4 为 UART 运行阶段,步骤 5 和 6 为可选步骤。
UART 驱动程序函数通过uart_port_t
识别不同的 UART 控制器。调用以下所有函数均需此标识。
三、UART简单使用
1、设置通信参数
结构体配置:
调用函数 uart_param_config()
并向其传递 uart_config_t
结构体,uart_config_t
结构体应包含所有必要的参数。
1 |
|
函数分步配置:
调用下表中的专用函数,能够单独配置特定参数。如需重新配置某个参数,也可使用这些函数
配置参数 | 函数 |
---|---|
波特率 | uart_set_baudrate() |
传输位 | 调用 uart_set_word_length() 设置 uart_word_length_t |
奇偶控制 | 调用 uart_parity_t 设置 uart_set_parity() |
停止位 | 调用 uart_set_stop_bits() 设置 uart_stop_bits_t |
硬件流控模式 | 调用 uart_set_hw_flow_ctrl() 设置 uart_hw_flowcontrol_t |
通信模式 | 调用 uart_set_mode() 设置 uart_mode_t |
表中每个函数都可使用 _get_ 对应项来查看当前设置值。例如,查看当前波特率值,调用 uart_get_baudrate() 。 |
2、分配引脚
通信参数设置完成后,可以配置其他 UART 设备连接的 GPIO 管脚。调用函数 uart_set_pin()
,指定配置 Tx、Rx、RTS 和 CTS 信号的 GPIO 管脚编号。如要为特定信号保留当前分配的管脚编号,可传递宏 UART_PIN_NO_CHANGE
。
1 |
|
3、安装驱动程序
通信管脚设置完成后,请调用 uart_driver_install()
安装驱动程序并指定以下参数:
- Tx 环形缓冲区的大小
- Rx 环形缓冲区的大小
- 事件队列句柄和大小
- 分配中断的标志
该函数将为 UART 驱动程序分配所需的内部资源。1
2
3
4
5
6
7
8
// Setup UART buffered IO with event queue
const int uart_buffer_size = (1024 * 2);
QueueHandle_t uart_queue;
// Install UART driver using an event queue here
ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, uart_buffer_size, \
uart_buffer_size, 10, &uart_queue, 0));
此步骤完成后,可连接外部 UART 设备检查通信。
注意:当TX 缓冲区参数填 0 或 NULL 的时候,不使用缓冲区,使用uart_write_bytes()发送操作时,在数据发送之前将会阻塞。
同样也有不阻塞的函数uart_tx_chars(),它不会为等待TX FIFO有足够的空间而阻塞,而是将填充可用的TX FIFO。此函数返回时,FIFO是满的。
示例:
1 |
|
3、收发数据
使用函数uart_write_bytes()
和 uart_read_bytes()
分别进行发送数据以及接收数据。两个函数的参数均为(UART_NUM,发送内容首地址/接受缓冲区地址,长度)
下面是一个简单的UART通信示例,展示如何使用ESP32进行数据的发送和接收。
1 |
|
连接硬件:
测试接收发送效果:
发送:
接收: