ESP32-IDF USART 专题

ESP32 (UART 485通讯)-串口之485通讯(3) 提示:本博客作为学习笔记,有错误的地方希望指正 文章目录一、ESP32串口介绍二、硬件设计三、实现代码四、串口实验演示结果五、ESP32串口函数API5.1、uart_types.h文件中的内容的API5.2、在uart.h文件中的内容的API 一、ESP32串口介绍   UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。   一个典型的 UART 帧开始于一个起始位,紧接 阅读详情


第一节主要介绍 ESP32-IDF 相关 API,在第二节介绍如何在 ESP32 上使用 USART,第三节为实例演示。

一、基本介绍

API 参考路径 esp-idf/components/esp_driver_uart/include/driver/uart.h。

1、配置结构体

1.1 uart_config_t

typedef struct {
   
   
    int baud_rate;                      /*!< UART baud rate*/
    uart_word_length_t data_bits;       /*!< UART byte size*/
    uart_parity_t parity;               /*!< UART parity mode*/
    uart_stop_bits_t stop_bits;         /*!< UART stop bits*/
    uart_hw_flowcontrol_t flow_ctrl;    /*!< UART HW flow control mode (cts/rts)*/
    uint8_t rx_flow_ctrl_thresh;        /*!< UART HW RTS threshold*/
    union {
   
   
        uart_sclk_t source_clk;             /*!< UART source clock selection */
#if (SOC_UART_LP_NUM >= 1)
        lp_uart_sclk_t lp_source_clk;       /*!< LP_UART source clock selection */
#endif
    };
} uart_config_t;

该结构体用于 USART 初始化设置。

  • baud_rate:设置波特率
  • data_bits:数据位长度
  • parity:设置校验位模式
  • stop_bits:设置停止位长度
  • flow_ctrl:硬件流控制
  • rx_flow_ctrl_thresh:设置 UART 硬件流控制(RTS/CTS)的阈值。当接收到的数据达到这个阈值时,UART 硬件会自动发送 RTS 信号,请求发送方暂停发送数据,直到接收到的数据被处理完毕。这样可以避免数据溢出,提高数据传输的稳定性。
  • source_clk:时钟源,见下:
typedef enum {
   
   
    UART_SCLK_APB = SOC_MOD_CLK_APB,           /* 使用 APB 时钟 */
    UART_SCLK_REF_TICK = SOC_MOD_CLK_REF_TICK, /* 使用外部时钟 */
    UART_SCLK_DEFAULT = SOC_MOD_CLK_APB,       /* 默认使用 APB 时钟 */
} soc_periph_uart_clk_src_legacy_t;

1.2 uart_intr_config_t

typedef struct {
   
   
    uint32_t intr_enable_mask;          /*!< UART interrupt enable mask, choose from UART_XXXX_INT_ENA_M under UART_INT_ENA_REG(i), connect with bit-or operator*/
    uint8_t  rx_timeout_thresh;         /*!< UART timeout interrupt threshold (unit: time of sending one byte)*/
    uint8_t  txfifo_empty_intr_thresh;  /*!< UART TX empty interrupt threshold.*/
    uint8_t  rxfifo_full_thresh;        /*!< UART RX full interrupt threshold.*/
} uart_intr_config_t;

该结构体用于 USART 中断配置。

  • intr_enable_mask:中断使能掩码,通过位运算(如按位或)可以连接多个 UART 中断使能标志,例如,对应于 UART_TX、UART_RX、UART_ERROR 等不同的中断类型。
  • rx_timeout_thresh:接收超时阈值,单位为发送一个字节的时间。当在此阈值内没有接收到新数据时,将触发超时中断,用于处理接收操作的超时情况。
  • txfifo_empty_intr_thresh:发送 FIFO 空中断阈值,指定了 UART 发送 FIFO 缓冲区为空时触发的中断阈值。当 FIFO 中的数据量低于此阈值时,将触发与发送操作相关的中断,可以用于确认数据是否成功发送。
  • rxfifo_full_thresh:接收 FIFO 满中断阈值,在 FIFO 满的情况下,如果再次接收到数据,将触发接收满中断,用于处理接收数据缓冲区可能溢出的情况。

1.3 uart_event_t

typedef struct {
   
   
    uart_event_type_t type; /*!< UART event type */
    size_t size;            /*!< UART data size for UART_DATA event*/
    bool timeout_flag;      /*!< UART data read timeout flag for UART_DATA event (no new data received during configured RX TOUT)*/
    /*!< If the event is caused by FIFO-full interrupt, then there will be no event with the timeout flag before the next byte coming.*/
} uart_event_t;

该结构体用于表示 UART 事件的相关信息。

  • type:事件类型
  • size:存放 UART_DATA 事件的有效数据大小
  • timeout_flag:指示 UART 数据读取是否超时。当接收过程中没有在配置的接收超时时间内接收到新的数据时,这个标志会被设置为 true。如果事件是由 FIFO满中断引起的,则在接下来的字节到达之前不会有带超时标志的事件。

2、常用 API

2.1 驱动相关

2.1.1 uart_driver_install
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_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • rx_buffer_size:UART 接收环形缓冲区大小
    • tx_buffer_size:UART 发送环形缓冲区大小。如果设置为零,驱动程序将不使用 TX 缓冲区,TX 函数将阻塞任务直到所有数据都被发送出去。
    • queue_size:UART 事件队列大小
    • uart_queue:UART 事件队列句柄(输出参数)。成功后,此处将写入新的队列句柄以提供访问 UART 事件的权限。如果设置为 NULL,则驱动程序将不使用事件队列。
    • intr_alloc_flags:分配中断时使用的标志。一个或多个(按位或运算)ESP_INTR_FLAG_* 值(见 esp_intr_alloc.h)。
  • 作用
    • 安装 UART 驱动并设置 UART 为默认配置。UART ISR 处理器将被附加到与该函数正在运行的相同 CPU 内核上。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误
2.1.2 uart_driver_delete
esp_err_t uart_driver_delete(uart_port_t uart_num)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
  • 作用
    • 卸载 UART 驱动。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误
2.1.3 uart_is_driver_installed
bool uart_is_driver_installed(uart_port_t uart_num)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
  • 作用
    • 检查是否已安装驱动程序。
  • 返回值
    • true:驱动程序已安装
    • false:驱动程序未安装

2.2 中断相关

2.2.1 uart_clear_intr_status
esp_err_t uart_clear_intr_status(uart_port_t uart_num, uint32_t clr_mask)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • clr_mask:中断状态要清除的位掩码。
  • 作用
    • 清除 UART 中断标志位。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误
2.2.2 uart_enable_intr_mask
esp_err_t uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • enable_mask:启动位的位掩码。
  • 作用
    • 设置 UART 中断标志位。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

同理,禁用为:esp_err_t uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask)

2.2.3 uart_enable_rx_intr
esp_err_t uart_enable_rx_intr(uart_port_t uart_num)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
  • 作用
    • 使能 UART RX 中断(RX_FULL、RX_TIMEOUT)。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

禁用为:esp_err_t uart_disable_rx_intr(uart_port_t uart_num)

2.2.5 uart_enable_tx_intr
esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • enable:1: 启用; 0: 禁用
    • thresh:TX 中断的阈值(0 ~ UART_HW_FIFO_LEN(uart_num))
  • 作用
    • 使能 UART TX 中断(TX_FULL、TX_TIMEOUT)。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误
2.2.6 uart_intr_config
esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_conf)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • intr_conf :UART 中断配置
  • 作用
    • 配置 UART TX 中断。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

2.3 参数设置

2.3.1 uart_set_word_length
esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • data_bit:数据位长度
  • 作用
    • 设置 UART 数据位长度。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

读取使用函数:esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t *data_bit)

2.3.2 uart_set_stop_bits
esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bits)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • stop_bits:停止位长度
  • 作用
    • 设置 UART 停止位长度。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

读取使用函数:esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t* stop_bits)

2.3.3 uart_set_parity
esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • parity_mode:奇偶校验模式
  • 作用
    • 设置 UART 奇偶校验模式。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

读取使用函数:esp_err_t uart_get_parity, uart_port_t uart_num, uart_parity_t* parity_mode

2.3.4 uart_set_baudrate
esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baudrate)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • baudrate:波特率
  • 作用
    • 设置 UART 波特率。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

读取使用函数:esp_err_t uart_get_baudrate(uart_port_t uart_num, uint32_t *baudrate)

2.3.5 uart_set_pin
esp_err_t uart_set_pin(uart_port_t uart_num, int tx_io_num, int rx_io_num, int rts_io_num, int cts_io_num)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • tx_io_num:tx 引脚号
    • rx_io_num:rx 引脚号
    • rts_io_num:rts 引脚号
    • cts_io_num:cts 引脚号
  • 作用
    • 将 UART 外设的信号分配给 GPIO 引脚。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

内部信号可以输出到多个 GPIO 引脚。只能有一个 GPIO 引脚连接输入信号。

2.3.6 uart_set_mode
esp_err_t uart_set_mode(uart_port_t uart_num, uart_mode_t mode)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • mode:UART 要设置的模式
  • 作用
    • 设置 UART 通信模式。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误
2.3.7 uart_param_config
esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config)
  • 参数
    • uart_num:UART 端口号,最大为 UART_NUM_MAX - 1
    • uart_config:UART 配置参数
  • 作用
    • 设置 UART 配置参数。
  • 返回值
    • ESP_OK 成功
    • ESP_FAIL 参数错误

2.4 通信

2.4.1 uart_wait_tx_done
esp_err_t</
ESP32——串口通讯应用实例 ESP32的串口通讯 阅读详情

相关推荐

一文说清ESP32 IDF UART驱动的核心要点

深入解析ESP32 IDF环境下UART驱动的配置与使用技巧,涵盖初始化流程、中断处理及常见问题排查,帮助开发者高效利用esp32 idf实现稳定串口通信。

weixin_28746457的博客 498

(1)ESP32基础知识

ESP 分组计划介绍 ESP32 基础知识、开发环境搭建、基础外设使用、蓝牙、WiFi 、使用微信小程序控制开发板硬件等,后续有想写的再补充。

尽欢的博客 2105

ESP32 UART实战:ESP-IDF 5.4.4配置、RS485通信与问题排查

串口通信(UART)是嵌入式开发中历史最悠久、使用最广泛的通信方式之一。它通过两根数据线实现异步收发,具备连接简单、适用性广等特点,广泛应用于日志输出、传感器数据采集、GPS定位及工业现场设备对接。理解UART的帧格式、波特率误差、电平转换等基本原理,是排查乱码、丢字节等高频故障的关键。在ESP32平台上,基于ESP-IDF框架进行UART开发时,开发者不仅需要掌握基础的参数配置与收发调用,还需熟悉事件队列、DMA、RS485半双工控制等进阶用法。本文以ESP-IDF 5.4.4在Ubuntu环境下的安装为

weixin_33968104的博客 448

ESP32-IDF开发实例-UART/USART串口通信

串口通信 ESP32是一系列高度集成的、专为移动设备、可穿戴电子产品设计的物联网模块,其集成了天线开关、RF balun、功率放大器、低接收噪声放大器,滤波器、电源管理模块等,可以独立运行应用,也可以通过SPI/SDIO或I2C/UART接口为其他设备提供WiFi和蓝牙功能。 默认情况下,ESP32-IDF使用了第一个串口作为开发板的串口输入与输出,默认的波特率为115200。本次实例将演示使用第二个或第三个串口演示在ESP32-IDF中,如何使用串口通信。 1、硬件准备 NodeMCU ESP32-S

视觉与物联智能 3664

ESP IDF开发示例:UART/USART串口通信在物联网中的应用

在物联网应用中,串口通信是一种常用的通信方式,用于实现设备之间的数据交换和控制。总结起来,ESP IDF是一个强大的开发框架,提供了丰富的功能和示例代码,方便开发者在ESP32和ESP32-S2芯片上实现UART/USART串口通信的物联网应用。在上面的代码中,首先定义了UART的发送引脚和接收引脚,然后配置了UART的参数,如波特率、数据位、停止位和校验位。然后,在主任务中创建了一个名为。在这个示例中,ESP32开发板将通过UART发送数据给连接在串口上的外部设备,并接收来自外部设备的数据。

JmwvOverflow的博客 516

从代码到实践:手把手教你用EmbodiedOcc++实现高效3D占用预测(含ScanNet配置)

本文提供了EmbodiedOcc++框架在ScanNet数据集上实现高效3D占用预测的完整实践指南。从环境搭建、数据预处理入手,详细解析了其核心创新点——几何引导优化(GRM)与语义感知不确定性采样(SUS)的代码实现与配置,并分享了训练、评估及调参的实战技巧,帮助开发者快速掌握这一先进的3D感知技术。

terraform7cloud的博客 587

告别仿真失败!用Sigrity 2022 SystemSI搞定DDR4信号质量仿真的保姆级流程

本文详细介绍了如何使用Sigrity 2022 SystemSI工具进行DDR4信号完整性仿真,提供了一套避免仿真失败、提高仿真精度和加速仿真流程的保姆级方法。从模型验证、设计数据预处理到拓扑构建和参数提取,再到高级调试技巧和仿真加速方案,帮助硬件工程师系统性地解决DDR4信号质量仿真中的常见问题。

weixin_42537499的博客 340

VMware + ubuntu20.04 + qemu安装

遇到报错可参考:(从ubuntu裸系统开始安装)

NosONE 3230

Warning-[INFL_DELTA] Too many events zero delay loop

项目场景: 运用VCS工具执行仿真的时候,遇到如下错误提示,但仿真还在继续。 Warning-[INFL_DELTA] Too many events Possible zero delay loop. Too many events in the simulation at time 0 fs. 问题描述: 为什么会有这个问题; 什么导致了这个问题; 原因分析: 1、为什么会有这个问题 由于竞争条件或编码风格不明确,可能会产生零延时回路,导致仿真挂起或仿真时间无限。 2、什么导致了这个问题 举

hh199203的博客 1万+

innovus:sroute 双层follow pin的做法

根据std cellpower pin的层次可以分成两种情况。

m0_61544122的博客 2722

AD22等长布线规则

本文介绍了PCB布线中实现信号线等长的详细操作步骤:1.创建网络类(NetClass),将需要等长的信号线归入同一组;2.设置高速布线规则(High-SpeedRule),定义等长容差等参数;3.进行交互式等长布线(InteractiveLengthTuning),使用蛇形线调整线长;4.实时调整与最终检查,确保所有网络满足等长要求。文中还提供了实用技巧,如使用快捷键调整蛇形线参数、为关键信号设置更严格规则等。操作需在PCB设计软件中完成,通过统一管理、规则设置和精确调整来实现信号同步传输。

whm128的博客 1556

基于八叉树的k近邻搜索

在八叉树中,每个节点都表示一个正方体的体积元素(体素),并且每个节点都有八个子节点(在不为空的情况下)。搜索最近邻点:一旦确定了查询点在八叉树中的位置,就可以开始搜索最近邻点了。搜索过程通常从查询点所在的叶节点开始,并逐步扩展到相邻的叶节点和父节点,直到找到k个最近邻点为止。k近邻搜索的目标是在给定的点云数据中,找到一个查询点的k个最近邻点。定位查询点:在搜索过程中,首先需要确定查询点在八叉树中的位置。返回结果:最后,搜索算法会返回找到的k个最近邻点的索引和它们与查询点之间的距离。

twnkie的博客 674

【OpenClaw从入门到精通】第41篇:2026年4月最新版——从零开始搭建你的第一个安全AI助理(保姆级实战教程)

2026年3月CNCERT联合发布《OpenClaw安全使用实践指南》后,安全部署成为OpenClaw使用的核心前提。本文针对新手及进阶用户,基于官方安全指引,提供三套实战部署方案:阿里云一键部署(新手首选)、Docker容器隔离部署(进阶推荐)、本地安全安装(测试专用),并详解阿里云百炼Coding Plan API接入流程。全文涵盖环境准备、分步实操、安全加固、问题排查等全流程,所有命令可直接复制执行,无需依赖外部代码库。通过本文,读者可零基础搭建安全隔离的OpenClaw AI助理,兼顾实用性与安全性

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2196

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: ESP32-IDF GPIO 专题
下一篇: ESP32-IDF 通用定时器 GPTimer
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值