ESP32 串口
ESP32串口
链接:(25条消息) ESP32学习笔记(4)——UART串口使用_Leung_ManWah的博客-CSDN博客_esp32 uart0
概述
通用异步接收/发送器(UART)是一种硬件功能,它使用广泛采用的异步串行通信接口,如RS232、RS422、RS485来处理通信(即定时要求和数据帧)。UART提供了一种被广泛采用的廉价方法来实现不同设备之间的全双工或半双工数据交换。
ESP32芯片有三个UART控制器(UART0、UART1和UART2),每个控制器具有相同的寄存器集,以简化编程和提高灵活性。
每个UART控制器独立配置波特率、数据位长度、位顺序、停止位数、奇偶校验位等参数。所有控制器都兼容各种厂商的UART-enabled设备,还可以支持红外数据关联协议(IrDA)。
功能概述
下面介绍如何通过UART驱动的功能和数据类型,实现ESP32与其他UART设备之间的通信。概述反映了一个典型的编程工作流程,并分为以下几个部分:
(1)setting communication parameters—设置波特率、数据位、停止位等
(2)setting communication pins—分配连接到设备的引脚
(3)driver installion—为UART驱动器分配ESP32的资源
(4)running uart communication—发送/接收数据
(5)using interrupts—在指定的通信事件上触发中断
(6)deleting a driver—如果串口通信不在需要则释放分配的资源
步骤1~3组成配置阶段。步骤4开启串口通信。步骤5和6是可选的。
UART驱动程序的函数使用uart_port_t标识每个UART控制器。以下所有函数调用都需要此标识。
设置通信参数
UART通信参数可以在单个步骤中全部配置,也可以在多个步骤中单独配置
(1)单个步骤
调用函数uart_param_config()并向其传递一个uart_config_t结构。uart_config_t结构应该包含所有必需的参数。参见下面的示例。
(2)多个步骤
通过调用下表中的专用函数,分别配置特定参数。如果要重新配置单个参数,这些函数也很有用。
上面的每个函数都有一个对应的_get_来检查当前设置的值。例如,要检查当前的波特率值,可以调用uart_get_baudrate()。
设置通信引脚
设置通信参数后,需要配置另一台UART设备连接的GPIO物理引脚。为此,调用函数uart_set_pin()并指定GPIO引脚编号,驱动程序应将Tx、Rx、RTS和CTS信号路由到该引脚编号。如果需要为特定信号保留一个当前分配的引脚编号,可以传递宏UART_PIN_NO_CHANGE。
同样的宏也应该指定给那些不会被使用的引脚。
驱动安装
一旦通信引脚被设置,通过调用uart_driver_install( )安装驱动和指定接下来的参数:
(1)TX缓冲区的大小
(2)RX缓冲区的大小
(3)事件队列句柄和大小
(4)分配中断标志
该函数将为UART驱动程序分配所需的内部资源。
一旦步骤已经完成,你可以连接到外部串口设备和检测通信。
运行串口通信
串行通信由每个UART控制器的有限状态机(FSM)控制。
发送数据的过程包括以下几个步骤:
(1)写数据到串口的TX FIFO数组
(2)FSM对数据进行序列化
(3)FSM发送数据
接收数据的过程类似,但步骤相反:
(1)FSM处理传入的串行流并将其并行化
(2)FSM将数据写入Rx FIFO缓冲区
(3)从Rx FIFO缓冲器读数据
因此,应用程序将被限制为分别使用uart_write_bytes()和uart_read_bytes()从各自的缓冲区写入和读取数据,FSM将完成剩下的工作。
发送
在准备好传输数据之后,调用函数uart_write_bytes(),并将数据缓冲区的地址和数据长度传递给它。
该函数将数据复制到Tx环缓冲区(立即或在足够的可用空间之后),然后退出。
当Tx FIFO缓冲区中有空闲空间时,中断服务程序(ISR)将数据从环形缓冲区移动到后台的Tx FIFO缓冲区。
下面的代码演示了该函数的使用。
函数uart_write_bytes_with_break()类似于uart_write_bytes(),但会在传输结束时添加一个串行中断信号“串行中断信号”是指将发送线路保持在较低的位置一段时间超过一个数据帧。
另一个将数据写入Tx FIFO缓冲区的函数是uart_tx_chars()。与uart_write_bytes()不同,这个函数在空间可用之前不会阻塞。相反,它将写入所有可以立即装入硬件Tx FIFO的数据,然后返回写入的字节数。
接收
一旦数据被UART接收并保存在Rx FIFO缓冲区中,就需要使用函数uart_read_bytes()来检索它。在读取数据之前,可以通过调用uart_get_buffered_data_len()来检查Rx FIFO缓冲区中可用的字节数。下面给出了使用这些函数的示例
如果数据在Rx FIFO缓冲区不再被需要,你可以通过调用uart_flush()清除缓冲区。
函数
esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t * uart_queue, int intr_alloc_flags)
说明:安装串口驱动和设置串口到默认的配置。UART ISR处理程序将被附加到运行此函数的同一CPU核心上。
注意:Rx_buffer_size应该大于UART_FIFO_LEN
Tx_buffer_size要么为0要么大于UART_FIFO_LEN
返回:ESP_OK 成功 ESP_FAIL 参数错误
参数:uart_num:UART端口数,这个最大的端口数是UART_NUM_MAX -1
rx_buffer_size:UART RX缓冲区大小
tx_buffer_size:UART TX缓冲区大小。如果设置为0,驱动器将不使用TX buffer,TX功能将阻塞任务直到所有的数据被发送出去。
queue_size:UART事件队列大小/深度
uart_queue:串口事件队列句柄(输出的参数)。如果成功,这里将写入一个新的队列句柄,以提供对UART事件的访问。如果设置为NULL,驱动程序将不使用事件队列。
intr_alloc_flags:用于分配中断的标志。一个或多个(ORred) ESP_INTR_FLAG_*值。更多信息参见esp_intr_alloc.h。不要在这里设置ESP_INTR_FLAG_IRAM(驱动程序的ISR处理程序不在IRAM中)
bool uart_is driver_installed(uart_port_t uart_num)
说明:检测驱动器是否安装
返回:true驱动器已安装
false驱动器没有安装
参数:uart_num:UART端口数目,最大端口数目是UART_NUM_MAX-1
esp_err_t uart_driver_delete(uart_port_t uart_num)
说明:卸载UART驱动
返回:ESP_OK 成功
ESP_FAIL 参数错误
参数:uart_num:UART端口数,最大端口数是UART_NUM_MAX-1
esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rst_io_num, int cst_io_num)
说明:将UART外设的信号分配给GPIO引脚
注意:
如果为UART信号配置的GPIO号与该GPIO的一个IOMUX信号相匹配,则该信号将通过IOMUX直接连接。否则GPIO与信号将通过GPIO矩阵连接。例如,如果在ESP32上调用uart_set_pin(0,1,3,1,1, -1),因为GPIO1是UART0的默认TX引脚,GPIO3是UART0的默认RX引脚,它们将分别通过IOMUX连接到U0TXD和U0RXD,完全绕过GPIO矩阵。检查是在每个引脚的基础上执行的。因此,RX引脚可以通过GPIO矩阵绑定到GPIO上,而TX通过IOMUX绑定到GPIO上。
内部信号可输出到多个GPIO板。输入信号只能连接一个GPIO板。
返回:ESP_OK 成功
ESP_FAIL 参数错误
参数:uart_num:UART端口数,最大的端口数是UART_NUM_MAX-1
tx_io_num:UART TX引脚的GPIO number
rx_io_num:UART RX引脚的GPIO number
rts_io_num:UART RTS引脚的GPIO number
cts_io_num:UART CTS引脚的GPIO number
esp_err_t uart_enable_pattern_det_baud_intr(uart_port uart_num, char pattern_chr, uint8_t chr_num, int chr_tout, int post_idle, int pre_idle)
说明:UART启用模式检测功能。专为类似于“AT命令”的应用程序设计。当硬件检测到一系列相同的字符时,就会触发中断。
返回:ESP_OK 成功
ESP_FAIL 参数错误
参数:uart_num: UART端口数
pattern_chr:模式特征
chr_num:字符数,8位值
chr_tout:每个模式字符之间的间隔超时时间,16位值,单位为您配置的波特率周期。当持续时间大于这个值时,它将不会将该数据作为at_cmd字符。
post_idle:最后一个模式字符后的空闲时间,24位值,单位为APB (80Mhz)时钟周期。当持续时间小于这个值时,它不会将之前的数据作为最后一个at_cmd字符
pre_idle:第一个模式字符前的空闲时间,24位值,单位为APB (80Mhz)时钟周期。当持续时间小于这个值时,它不会将该数据作为第一个at_cmd字符。
esp_err_t uart_enable_rx_intr(uart_port_t uart_num)
说明:使能UART RX中断(rx_fifo接收满中断,rx_fifo超时中断:默认超时时间为10byte)
返回:ESP_OK 成功
ESP_FAIL 参数错误
参数:uart_num:UART端口数,最大的端口数是UART_NUM_MAX-1
esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t *size)
说明:UART获取RX环缓冲区缓存的数据长度
返回:ESP_OK 成功
ESP_FAIL 参数错误
参数:uart_num: UART端口数,这个最大的端口数是UART_NUM_MAX-1
size:接受缓存数据长度的size_t指针
esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait)
说明:等待直到UART TX FIFO为空
返回:ESP_OK 成功
ESP_FAIL 参数错误
ESP_ERR_TIMEOUT 超时
参数:uart_num: UART端口数,最大的端口数是UART_NUM_MAX-1
ticks_to_wait:超时时间,在RTOS心跳上计时
int uart_tx_chars(uart_port_t uart_num, const char *buffer, uint32_t len)
说明:从给定的缓冲区和长度发送数据到UART端口。这个函数在TX FIFO中不会等待足够的空间。它只会填充可用的TX FIFO,并在FIFO满时返回。
注意:此功能仅应在UART TX缓冲区未启用时使用。
返回:-1参数错误
其他(≥0)被放在TX FIFO缓冲区的字节数
参数:uart_num:UART端口数,这个最大的端口数是UART_NUM_MAX-1
buffer:数据数组地址
len:被发送的数据长度
int uart_write_bytes(uart_port_t uart_num, const void* src, zixe_t size)
说明:
从给定的缓冲区和长度发送数据到UART端口。如果UART驱动程序的参数' tx_buffer_size '被设置为零:这个函数将不会返回,直到所有数据被发送出去,或至少推入TX FIFO。否则,如果' tx_buffer_size ' > 0,这个函数将返回后复制所有的数据到tx环缓冲区,UART ISR然后将数据从环缓冲区逐渐移动到tx FIFO。
返回:-1:参数错误
其他(≥0)被推送到FIFO缓冲区的字节数
参数:uart_num:UART端口数,最大的端口数是UART_NUM_MAX-1
src:数据数组地址
size:被发送出的数据长度
int uart_write_bytes_with_break(uart_port_t uart_num, const void * src, size_t size, int brk_len)
说明:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器