ESP UART 介绍
1 UART 介绍
UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。
1.1 UART 通信协议
一个典型的 UART 帧开始于一个起始位,紧接着是有效数据,然后是奇偶校验位(可有可无),最后是停止位。
数据包格式如下

Start Bit
UART 数据传输线在不传输数据时通常保持在高电压电平。要开始传输数据,发送 UART 将传输线从高电平拉至低电平一 个时钟周期。当接收 UART 检测到高电压到低电压的转换时,它开始以波特率的频率读取数据帧中的位。
Data Frame
数据帧包含正在传输的实际数据。如果使用奇偶校验位,它的长度可以是 5 位到 8 位。如果不使用奇偶校验位,则数据帧可以是 9 位长。
Parity Bits
奇偶性描述了数字的偶数或奇数。奇偶校验位是接收 UART 判断数据在传输过程中是否发生变化的一种方式。电磁辐射、不匹配的波特率或长距离数据传输可能会改变位。
Stop Bits
为了发出数据包结束信号,发送 UART 将数据传输线从低电压驱动到高电压,持续 1 到 2 位持续时间。
以下为 Baudrate: 115200, Data Bits: 8, Parity: None, Stop Bits: 1 的波形
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guzeCjUf-1678431851237)(res/uart波形.png)]](https://img-blog.csdnimg.cn/dd076cf3caa9434fab37a75b2b988afb.png)
2 流控
流主要是解决收发双方速度不匹配的问题。当接收端接收到的数据处理不过来时,就向发送端发送不再接收的信号,发送端接收到这个信号之后就会停止发送,直到收到可以继续发送的信号再继续发送。流控可以控制数据传输的进度,进而防止数据丢失。
2.1 硬件流控
硬件流控需要除 RX 和 TX 之外额外增加两根控制线, 一根叫 CTS(Clear To Send),为输入信号; 一根叫 RTS(Require To Send), 为输出信号。 这两根线一个是接收控制,一个是发送控制。低电平说明可以发送数据,高电平代表发送端需要等待。

2.2 软件流控
软件流控是在发送的数据中插入特殊的字符 XON(0x11) 和 XOFF(0x13) 来控制传输。通过插入 XOFF 强制停止发送器发送数据,通过插入 XON 强制发送器发送数据。
2.3 区别
| 硬件流控 | 软件流控 |
|---|---|
| 硬件需要增加额外 2 跟线 | 硬件不需要改变 |
| 可以快速停止传输 | 需要等待前面的数据传输完成,存在延时 |
| 不会存在误操作 | 可能存在误识别(接收数据与控制字符相同) |
一般来说,在存在可能溢出的环境下,优先使用硬件流控。
2.4 UART 与 TTL, RS232 的关系
UART 更多关注规定编码格式的标准,如波特率(baud rate)、帧格式和波特率误差等等,更像是规定的一种协议。而 RS232、TTL、RS485 这类串行通信接口,它们定义了接口不同的电气特性,如 RS-232 是单端输入输 出,而 RS-485 为差分输入输出等,更像是借用此协议的具体的硬件。
| TTL | RS232 | RS485 | |
|---|---|---|---|
| 电平信号 | 电平信号为 5 V 或者 3.3 V | 接口的信号电平值较高,正负 6-15 V 皆可 | 高低电平由最小差分电压决定 |
| 传输方式 | 全双工 | 全双工 | 半双工 |
| 传输距离 | 理论上为 10 英尺(5 m),抗噪声性能差 | 最远通信距离是 50 英尺(15 m) | 差分信号,理论通讯距离可达 1200 米 |
芯片 UART 一般都是 TTL 电平的。
2.5 USB 转 TTL 串口芯片
在实际使用中,我们使用电脑的 USB 访问 ESP32 的 UART 外设,在这中间,就需要一个 USB 转 TTL 串口的芯片,以下就是目前常见的一些类型,一张表比较它们的各种特性:
| CP2102/2103 | CH340系列 | FT232R | PL2303HX | |
|---|---|---|---|---|
| 生产厂家 | Silicon | 南京沁恒 | FDTI | Prolific |
| 最高速率 | 1 M | 2 M | 3 M | 12 M |
| Bit位数 | 5、6、7、8 | 5、6、7、8 | 7、8 | 5、6、7、8 |
| 校验位 | 奇/偶/1/0/无 | 奇/偶/1/0/无 | 奇/偶/1/0/无 | 奇/偶/1/0/无 |
| 停止位 | 1、1.5、2 | 1、2 | 1、2 | 1、1.5、2 |
| 硬件流控 | 有 | 有 | 有 | 有 |
| 稳定性 | 好 | 好 | 最好 | 差 |
| 价格 | 中 | 低 | 高 | 低 |
目前 ESP32 系列开发板上大多集成的是 CP2102。
3 ESP32 UART 硬件
当前 ESP32 系列芯片均集成多个 UART 外设,支持异步通信(RS232 和 RS485)和 IrDA。
以下为不同芯片间 UART 存在的差异。
| ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C3 | ESP32-C2 | |
|---|---|---|---|---|---|
| UART 数量 | 3 | 2 | 3 | 2 | 2 |
| 最大通信速率 | 5 Mbps | 5 Mbps | 5 Mbps | 5 Mbps | 2.5 Mbps |
| 是否支持 DMA | 是 | 是 | 是 | 是 | 否 |
从 AT 这边的测试看,使用杜邦线最大实际 UART 通信速率可以达到 2 Mbps,超过之后数据会有错误 ,当需要使用更高的通信速率时,最好从 PCB 走线。
3.1 常用中断
| 中断名称 | 简介 |
|---|---|
| UART_TX_DONE_INT | 当发送器发送完 FIFO 中的所有数据时触发此中断 |
| UART_RXFIFO_TOUT_INT | 当接收器接收一个字节的时间大于 UART_RX_TOUT_THRHD 时触发此中断 |
| UART_RXFIFO_OVF_INT | 当接收器接收到的数据量多于 FIFO 的存储量时触发此中断 |
| UART_FRM_ERR_INT | 当接收器检测到数据帧错误时触发此中断 |
| UART_PARITY_ERR_INT | 当接收器检测到校验位错误时触发此中断 |
| UART_TXFIFO_EMPTY_INT | 当发送 FIFO 中的数据量少于 UART_TXFIFO_EMPTY_THRHD 所指定的值时触发此中断 |
| UART_RXFIFO_FULL_INT | 当接收器接收到的数据多于 UART_RXFIFO_FULL_THRHD 所指定的值时触发此中断 |
| UART_WAKEUP_INT | UART 被唤醒时产生此中断 |
| UART_BRK_DET_INT | 当接收器在停止位之后检测到 NULL 时触发此中断 |
ESP 芯片的 UART RF FIFO 和 TX FIFO 共用一段 RAM 空间,在 IDF 实现中 RX FIFO 和 TX FIFO 相互独立,长度均为 128 字节。接收超过 FIFO 最大值之后就会触发 OVF 的溢出中断。
3.2 ESP-IDF 的实现
当前 ESP-IDF 内部使用 UART RF FIFO 的方式进行读写,并未使用 UART DMA。但是在 UART 驱动中, TX FIFO 和 RX FIFO 会分别和对应的 ringbuffer 相连。
- RX FIFO 在接收到数据后会将数据抛给 RX 的 ringbuffer 并触发 UART_DATA 事件
- TX 的 ringbuffer 在收到应用层数据后开始将数据发给 TX FIFO 发送
在此期间会通过 UART 事件标识当前的状态,UART 事件与中断的对应关系
| Event | Interrupt | Comment |
|---|---|---|
| UART_DATA | 1. UART_RXFIFO_TOUT_INT 2. UART_RXFIFO_FULL_INT | 1. Timeout: 10 字节传输时间 2. Full thresh: 120 字节 |
| UART_FIFO_OVF | UART_RXFIFO_OVF_INT | FIFO 溢出阈值为 128 字节 |
| UART_BUFFER_FULL | / | UART 初始的 RX 的 ringbuffer 值满 |
| UART_PATTERN_DET | UART_INTR_CMD_CHAR_DEF | 收到指定数量的特殊字符,比如 AT 中的 “+++” |
| UART_BREAK | UART_INTR_BRK_DEF | 接收到 BREAK |
| UART_FRAME_ERR | UART_FRM_ERR_INT | |
| UART_PARITY_ERR | UART_PARITY_ERR_INT | |
| UART_DATA_BREAK | / | uart_write_bytes_with_break 发送完数据后发送 BREAK |
| UART_WAKEUP | UART_WAKEUP_INT |
备注: BREAK 信号就是持续一段时间(大于一个 UART 帧)的低电平。
3.3 常见问题分析
-
调用
uart_read_bytes接口读到的数据长度比实际发的数据短- ESP32 系列芯片均使用 FIFO 的方式读写 UART 数据,默认在 120 字节时会产生中断,解除
uart_read_bytes的堵塞状态,如果发送长度大于 122 字节,则可能需要多次调用 UART_READ 接口读取
- ESP32 系列芯片均使用 FIFO 的方式读写 UART 数据,默认在 120 字节时会产生中断,解除
-
UART 初始化时配置的 rx_buffer_size 明明很大,却出现了丢数据的情况
- 丢数据是 FIFO 满导致的,此时没有及时将数据转出到 rx buffer。一般会触发 UART_FIFO_OVF, 此时建议加流控,或者将 FULL_THRESH 阈值调低一些。
-
ESP32 调用休眠接口后, UART 通信异常
- ESP32 UART 支持两种时钟源, 80 MHz APB_CLK 以及参考时钟 REF_TICK。默认使用 APB_CLK,在休眠时此时钟源将会停止工作,因此,如果需要支持休眠,则需要在 UART 初始化时配置 使用 REF_TICK,需要注意的是,此时钟源只能跑到波特率 115200。
相关文章:
ESP UART 介绍
1 UART 介绍 UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。 1.1 UART 通信协议 一个典型的 UART 帧开始…...
第十三届蓝桥杯省赛Python大学B组复盘
目录 一、试题B:寻找整数 1、题目描述 2、我的想法 3、官方题解 4、另解 二、试题E:蜂巢 1、题目描述 2、我的想法 3、官方题解 三、试题F:消除游戏 1、题目描述 2、我的想法(AC掉58.3%,剩下全超时&#x…...
linux入门---vim的配置
这里写目录标题预备知识如何配置vimvim一键配置预备知识 在配置vim之前大家首先得知道一件事就是vim的配置是一人一份的,每个用户配置的vim都是自己的vim,不会影响到其他人,比如说用户xbb配置的vim是不会影响到用户wj的,虽然不同…...
Python简写操作(for、if简写、匿名函数)
Python简写操作(for、if简写、匿名函数)1. for 简写1.1 一层 for 循环1.2 两层 for 循环2. if 简写3. for 与 if 的结合简写4. 匿名函数 lambda1. for 简写 举个例子: y [1, 2, 3, 4, 5, 6] result [(i * 2) for i in y] print(result)# …...
毕业设计常用模块之温湿度模块DHT11模块使用
DHT11是一款可以测量温度数据和湿度数据的传感器 产品特点 暖通空调、除湿器、农业、冷链仓储、测试及检测设备、消费品、汽车、自动控制、数据记录器、气 象站、家电、湿度调节器、医疗、其他相关湿度检测控制 外形尺寸 第3管脚:NC 是没有用的 典型电路 通信方式…...
Cadence Allegro 导出Design Rules Net Shorts Check(DRC)Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Design Rules Net Shorts Check(DRC)Report作用3,Design Rules Net Shorts Check(DRC)Report示例4,Design Rules Net Shorts Check(DRC)Report导出方法4.1,方法14.2,方法2...
第 46 届世界技能大赛浙江省选拔赛“网络安全“项目C模块任务书
第46届世界技能大赛浙江省选拔赛"网络安全"项目C模块(夺旗行动(CTF)挑战)第46届世界技能大赛浙江省选拔赛"网络安全"项目C模块第一部分 WEB第二部分 CRYPTO第三部分 REVERSE第四部分 MISC第五部分 PWN第46届世…...
C++:详解C++11 线程(一):MingGW 各版本区别及安装说明
MingGW 各版本区别一:MinGW、MinGW-w64 简介二:MinGW 各版本参数说明三:下载解压一:MinGW、MinGW-w64 简介 MinGW(全称为 Minimalist GNU for Windows),它实际上是将经典的开源 C 语言编译器 G…...
第十二章 ArrayList和 LinkedList的区别
ArrayList:基于动态数组(自动扩容),连续内存存储,由于底层是数组,适合使用下标进行访问,但扩容一直都是数组的缺点,所以使用尾插法进行扩容可以有效提高扩容效率。还有就是创建Array…...
案例06-复用思想的接口和SQL
目录 一:背景介绍 二:思路&方案 三:过程 1.Controller层接口的复用 2.Mapper层sql语句的复用 四:总结 一:背景介绍 我们在开发项目的过程中非常容易出现的一种现象就是用什么我就直接写什么,就像我…...
【Java学习笔记】17.Java 日期时间(2)
前言 本章继续介绍Java的日期时间。 Calendar类 我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案…...
【学习Docker(八)】Docker Canal的安装与卸载
座右铭:《坚持有效输出,创造价值无限》 最近想了解下canal,自行搭建并完成数据同步。经过了几天的踩坑之旅,今天终于搭建成功了。 环境:canalv1.1.5、MySQL8.0、JDK1.8 安装MySQL 创建存放目录 mkdir /docker-localm…...
python的django框架从入门到熟练【保姆式教学】第三篇
在前两篇博客中,我们介绍了Django框架的模型层和数据库迁移功能。本篇博客将重点介绍Django的视图层(View),并讲解如何创建视图函数和URL路由。 视图层(View) Django的视图层是Django应用程序的另一个核心…...
Open3D(C++) Ransac拟合球体(详细过程版)
目录 一、算法原理1、计算流程2、参考文献二、代码实现三、结果展示一、算法原理 1、计算流程 空间球方程: ( x − a ) 2 + ( y − b...
Antlr Tool与antlr runtime的版本一致性问题
1. 意外的问题 在学习Antlr4的visitor模式时,使用IDEA的Antlr插件完成了Hello.g4文件的编译,指定的package为com.sunrise.hello 使用visitor模式遍历语法解析树,遍历过程中打印hello语句 public class HelloVisitorImpl extends HelloBaseVi…...
嵌入式中CAN测试自动化方法分析
can的基础知识 CAN是什么? CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类…...
基于c++、opencv、cuda、Visual Studio编程
一、前言 opencv自带的支持的cuda的函数不少,但是不一定够用,而且已经支持的函数有些还不是十分的完善。所以更多的时候还需要编写自己的kernel以进行加速自定义处理。如果基于opencv进行计算机视觉相关开发工作,那么熟悉c++、opencv、cuda编程是避免不了的环节。 二、准备工…...
MATLAB——DFT(离散傅里叶变换)
题目1: 已知有限长序列x(n)为: x(n)[0,1,2,3,4,5,6,7,8,9],求x(n)的DFT和IDFT。要求 1)画出序列傅里叶变换对应的|X(k)|和arg[X(k)]图形。 2)画出原信号与傅里叶逆变换IDFT[X(k)]图形进行比较。 知识点: DF…...
高端Zynq ultrascale+使用GTH回环测试 提供2套工程源码和技术支持
这目录1、前言2、GTH 高速收发器介绍GTH 高速收发器结构参考时钟的选择和分配GTH 发送端GTH 接收端3、vivado工程详解4、上板调试验证5、福利:工程代码的获取1、前言 Xilinx系列FPGA内置高速串行收发器,配有可配置的IP方便用户调用,按照速度…...
入门(Createing a scene)
这一部分将对three.js来做一个简要的介绍 首先将开始搭建一个场景,其中包含一个正在旋转的立方体 梦开始的地方 在开始使用threeJS之前,我们需要创建一个HTML文件来显示它(将下列HTML代码保存为你电脑上的一个HTML文件然后在你的浏览器中打…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
