ESP UART 介绍

news2024/11/25 4:06:56

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)]

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 为差分输入输出等,更像是借用此协议的具体的硬件。

TTLRS232RS485
电平信号电平信号为 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/2103CH340系列FT232RPL2303HX
生产厂家Silicon南京沁恒FDTIProlific
最高速率1 M2 M3 M12 M
Bit位数5、6、7、85、6、7、87、85、6、7、8
校验位奇/偶/1/0/无奇/偶/1/0/无奇/偶/1/0/无奇/偶/1/0/无
停止位1、1.5、21、21、21、1.5、2
硬件流控
稳定性最好
价格

目前 ESP32 系列开发板上大多集成的是 CP2102。

3 ESP32 UART 硬件

当前 ESP32 系列芯片均集成多个 UART 外设,支持异步通信(RS232 和 RS485)和 IrDA。

以下为不同芯片间 UART 存在的差异。

ESP32ESP32-S2ESP32-S3ESP32-C3ESP32-C2
UART 数量32322
最大通信速率5 Mbps5 Mbps5 Mbps5 Mbps2.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_INTUART 被唤醒时产生此中断
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 相连。

  1. RX FIFO 在接收到数据后会将数据抛给 RX 的 ringbuffer 并触发 UART_DATA 事件
  2. TX 的 ringbuffer 在收到应用层数据后开始将数据发给 TX FIFO 发送

在此期间会通过 UART 事件标识当前的状态,UART 事件与中断的对应关系

EventInterruptComment
UART_DATA1. UART_RXFIFO_TOUT_INT
2. UART_RXFIFO_FULL_INT
1. Timeout: 10 字节传输时间
2. Full thresh: 120 字节
UART_FIFO_OVFUART_RXFIFO_OVF_INTFIFO 溢出阈值为 128 字节
UART_BUFFER_FULL/UART 初始的 RX 的 ringbuffer 值满
UART_PATTERN_DETUART_INTR_CMD_CHAR_DEF收到指定数量的特殊字符,比如 AT 中的 “+++”
UART_BREAKUART_INTR_BRK_DEF接收到 BREAK
UART_FRAME_ERRUART_FRM_ERR_INT
UART_PARITY_ERRUART_PARITY_ERR_INT
UART_DATA_BREAK/uart_write_bytes_with_break 发送完数据后发送 BREAK
UART_WAKEUPUART_WAKEUP_INT

备注: BREAK 信号就是持续一段时间(大于一个 UART 帧)的低电平。

3.3 常见问题分析

  1. 调用 uart_read_bytes 接口读到的数据长度比实际发的数据短

    • ESP32 系列芯片均使用 FIFO 的方式读写 UART 数据,默认在 120 字节时会产生中断,解除 uart_read_bytes 的堵塞状态,如果发送长度大于 122 字节,则可能需要多次调用 UART_READ 接口读取
  2. UART 初始化时配置的 rx_buffer_size 明明很大,却出现了丢数据的情况

    • 丢数据是 FIFO 满导致的,此时没有及时将数据转出到 rx buffer。一般会触发 UART_FIFO_OVF, 此时建议加流控,或者将 FULL_THRESH 阈值调低一些。
  3. ESP32 调用休眠接口后, UART 通信异常

    • ESP32 UART 支持两种时钟源, 80 MHz APB_CLK 以及参考时钟 REF_TICK。默认使用 APB_CLK,在休眠时此时钟源将会停止工作,因此,如果需要支持休眠,则需要在 UART 初始化时配置 使用 REF_TICK,需要注意的是,此时钟源只能跑到波特率 115200。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.9多线程

一.常见锁策略1.悲观锁 vs乐观锁体现在处理锁冲突的态度①悲观锁:预期锁冲突的概率高所以做的工作更多,付出的成本更多,更低效②乐观锁:预期锁冲突的概率低所以做的工作少,付出的成本更低,更搞笑2.读写锁 vs 普通的互斥锁①普通的互斥锁,只有两个操作 加锁和解锁只有两个线程针…

奇点云DataSimba发版全解析:“企业级”版本升级,提供最佳组合

近日,奇点云发布数据云产品商业化版本的全新升级:DataSimba(数据云平台)提供极速版、专业版、旗舰版、红旗版,可靠性、可用性、可服务性再进阶,四大版本满足不同企业选择。 「乐高式DIY」or「最佳组合」&am…

推荐几款主流好用的远程终端连接管理软件

一、介绍 远程终端连接管理软件是管理服务器、虚拟机等远程计算机系统不可或缺的工具之一,它可以通过网络连接到另一台计算机,以执行命令、编辑文件或进行其他管理任务,下面我将为大家介绍几款主流好用的远程终端连接管理软件,并…

Navisworks编辑材质和Revit快速切换材质问题

一、如何在Navisworks2016中编辑材质 初次使用NW2016-2017时发现,原来用于创建编辑材质的小地球不见了,如图1所示,在各大技术群里求助没有回应,度娘搜索也总是摇头。 经过仔细排查可能出现的地方,终于找到了可以编辑材…

数仓生态圈辅助工具之Sqoop导入导出数据和Oozie工作流调度

数仓生态圈辅助工具 知识点01:Apache Sqoop介绍、工作机制 Sqoop介绍 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统; 导出数…

案例14-课程推送页面逻辑整理--vue

目录一级目录二级目录三级目录一、背景介绍二、问题分析问题1:逻辑边界不清晰,封装意识缺乏问题问题2:展示效果上的问题三、解决过程问题一 代码结构混乱问题解决问题二 代码结构混乱问题解决问题三 展示效果上的细微问题四、总结一级目录 二…

JVM(学习原因,虚拟机,作用,位置,组成,各部分用途,执行流程,架构类型)

JVM概述 这里写目录标题JVM概述1.1为什么学习 JVM1.2虚拟机1.3JVM 作用1.4JVM的位置1.5JVM组成1.6各个组成部分的用途1.7JVM代码的执行流程1.8JVM架构类型1.1为什么学习 JVM 中高级程序员必备技能 项目管理,性能调优 1.2虚拟机  所谓虚拟机(Virtual Machine&a…

Linux基础命令-ss显示socket信息

Linux基础命令-netstat显示网络状态 ss 一. 命令介绍 先使用手册查看命令介绍信息 NAME ss - another utility to investigate sockets DESCRIPTION ss is used to dump socket statistics. It allows showing information similar to netstat. It can display more TCP and …

Flink从入门到精通系列(一)

1、Flink概述 Apache Flink 是一个框架和分布式处理引擎,用于在, 无边界和有边界数据流上进行有状态的计算 ,Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 Apache Flink 功能强大,支持开发…

使用自定义数据绘制脑地形矩阵图

最近做数据处理,想画点自己想要的图,但是找遍了各种库,都没有一个函数可以实现我想要的效果,所以关机时刻还得靠自己啊,自己动手丰衣足食,记录一下实现过程,方便以后查阅。 使用自定义数据绘制脑地形矩阵图 对于处理后的数据我想实现下图所示的效果,以矩阵的形式排列脑…

PyQt5可视化 7 饼图和柱状图实操案例 ②建表建项目改布局

目录 一、数据库建表 1 建表 2 插入数据 3 查看表数据 二、建立项目 1 新建项目 2 appMain.py 3 myMainWindow.py 4 myChartView.py 2.4.1 提升的后果 2.4.2 QmyChartView类说明 2.4.3 添加代码 三、修改myMainWindow.py程序,添加功能 1 打开数据库 …

第十届省赛——8人物相关性分析(数组)

题目:试题 H: 人物相关性分析时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分【问题描述】小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob有多少次同时出现。更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是&a…

微小目标识别研究(2)——基于K近邻的白酒杂质检测算法实现

文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现代码这部分是手动实现的,并没有直接调用相关的库完整的代码——调用ope…

千川投放50问(完)!如何跑出高投产?

第四十一问:计划初期成本很高,是否要关掉重新跑?首先看一下是不是初期回传延迟导致的成本偏高。如果成本没有高的,不建议暂停,先观察一段时间数据,给它一点学习时间。当系统积累过足够的模型之后&#xff0…

08-Oracle游标管理(定义,打开、获取数据及关闭游标)

目标 1.确定何时需要显示游标2.声明、打开和关闭显示游标3.从显示游标中提取数据4.了解与游标有关的属性5.使用游标FOR循环检索游标中的数据6.在游标FOR循环的子查询中声明游标7.评估使用逻辑运算符结合在一起的布尔条件游标 1、在使用一个PL/SQL块来执行DML语句或只返回一行结…

2月更新 | Visual Studio Code Python

我们很高兴地宣布,2023年2月版 Visual Studio Code Python 和 Jupyter 扩展现已推出!此版本包括以下改进:从激活的终端启动 VS Code 时的自动选择环境 使用命令 Python: Create Environmen 时可选择需求文件或可选依赖项 预发布:改…

性能优化之HBase性能调优

HBase是Hadoop生态系统中的一个组件,是一个分布式、面向列存储的内存型开源数据库,可以支持数百万列(MySQL4张表在HBase中对应1个表,4个列)、超过10亿行的数据存储。可用作:冷热数据分离HBase适合作为冷数据…

坐标系、视窗体(裁剪区域),存储着色器

坐标系 两种常见的投影/坐标系,正交和透视,实际上只是特定的4x4变换矩阵。啥都不规定默认的就是-1.0~1.0的笛卡尔坐标系。 正交: 在opengl的核心框架下,没有提供任何内置渲染管线,所以在提交一个几何图形进行渲染之前&…

Ubuntu Protobuf 安装(测试有效)

安装流程 下载软件 下载自己要安装的版本:https://github.com/protocolbuffers/protobuf 下载源码编译: 系统环境:Ubuntu16(其它版本亦可),Protobuf-3.6.1 编译源码 cd protobuf# 当使用 git clone 下来的…

【C语言】操作符详解总结(万字)

操作符详解1. 操作符分类2. 算术操作符3. 移位操作符3.1 整数的二进制是怎么形成的3.2 左移操作符3.3 右移操作符4. 位操作符5. 赋值操作符6. 单目操作符6.1 单目操作符介绍6.2 sizeof 和 数组7. 关系操作符8. 逻辑操作符9. 条件操作符9.1 练习19.2 练习210. 逗号表达式11. 下标…