最常见的嵌入式通信协议—— UART | 深入数据帧格式
最常见的嵌入式通信协议—— UART | 深入数据帧格式
UART(通用异步收发传输器)是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。本文将深入探讨UART的基本概念、硬件接线、数据帧格式、波特率等核心知识点,并通过具体的实践案例进行讲解。
1. 什么是UART?
通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。如果对于通信方式的分类不甚明了的话,可以参考一下我的另一篇博文:嵌入式通信协议的前言——通信方式的分类
2. 硬件接线
- 通信双方TX、RX交叉连接
- 通信双方共地
3. 数据帧格式
启动位:
占1个位长
保持逻辑0电平
有效数据位:
可选5、6、7、8、9个位长(通常是8bit)
LSB在前,MSB在后,即最低有效位在前
校验位:
1位,可选是否有
常见的是奇偶校验位
停止位:
可选1、1.5、2个位长
保持逻辑1电平
停止位不仅仅表示传输的结束,也是在提供计算机校正时钟同步的机会,适用于停止位的位数越多,不同时钟的容忍程度越大
空闲位:
总线空闲时默认逻辑1电平
4. 波特率
4.1. 波特率和比特率的定义
波特率有一个很重要的相关概念,称为比特率。
- 比特率:每秒钟传输的比特数,单位 bit/s,bps
- 波特率:每秒钟传输的码元数,单位 symbol/s,Baud
4.2. 波特率和比特率之间的关系
举一个生活化的例子,如果把通信系统类比到公共交通运输系统,那么比特的概念就是运输的最小单位——人,而码元可以类比为出租车、公交车、火车等等不同的交通运输车辆。波特率可以理解为单位时间内的发车数量,比特率可以理解为单位时间内运输的出行人数。
比特率 = 波特率 * log2M,M 表示每个码元承载的信息量( M 也可以认为是进制数)。
二进制系统中,每个码元都存在2种状态,所以波特率数值上等于比特率。
4.3. 波特率的作用
在串口通信中,发送端和接收端需要规定好一个相同的波特率,才能保证通信正常。在描述波特率的作用时,我比较喜欢用打羽毛球来进行比喻。发送端是发球的人,接收端是接球的人,而波特率就是两个打球的人挥拍的频率,如果这两个人的节奏一致,羽毛球就可以很长时间不落地。而如果有快有慢,甲的球刚刚发出去,乙的球拍已经挥完放下了,就很容易出现丢球的情况。
5. 8N1 表示的是什么意思?
- 8N1:8 表示的是数据位8位,N 表示的是无校验位,1 表示的是1位停止位
除了最常见的 8N1 之外,还有:
- 7E1:7个数据位,偶校验位,1个停止位
- 8O2:8个数据位,奇校验位,2个停止位
6. UART 通信分析实践
UART在波特率为9600、数据帧格式为默认 8-N-1 的情况下:
6.1. 发送"Hello, World!",请写出数据帧。
"Hello,World!"一共有12个字节,所以一共需要发送12个UART数据帧。
根据ASCII码,将字节转成二进制表示:
字符 | ASCII码 | 二进制 |
---|---|---|
H | 72 | 01001000 |
e | 101 | 01100101 |
l | 108 | 01101100 |
l | 108 | 01101100 |
o | 111 | 01101111 |
, | 44 | 00101100 |
W | 87 | 01010111 |
o | 111 | 01101111 |
r | 114 | 01110010 |
l | 108 | 01101100 |
d | 100 | 01100100 |
! | 33 | 00100001 |
- 串口通信的数据位通常是 LSB 先发送,这意味着在传输字符的时候,二进制表示的 ASCII 码是从右向左发送的。
字符 | 二进制 | LSB 开始发送 |
---|---|---|
H | 01001000 | 00010010 |
e | 01100101 | 10100110 |
l | 01101100 | 00110110 |
l | 01101100 | 00110110 |
o | 01101111 | 11110110 |
, | 00101100 | 00110101 |
W | 01010111 | 11101010 |
o | 01101111 | 11110110 |
r | 01110010 | 01000111 |
l | 01101100 | 00110110 |
d | 01100100 | 00100110 |
! | 00100001 | 10000010 |
- 数据格式默认8-N-1,所以开始位1位,结束位1位,无校验位。S 代表起始位,E 代表停止位:
字符 | 发送的数据帧格式 |
---|---|
H | S 00010010 E |
e | S 10100110 E |
l | S 00110110 E |
l | S 00110110 E |
o | S 11110110 E |
, | S 00110101 E |
W | S 11101010 E |
o | S 11110110 E |
r | S 01000111 E |
l | S 00110110 E |
d | S 00100110 E |
! | S 10000010 E |
6.2. 每秒传输多少个有效字节?每秒传输多少个有效比特?
- 1 byte = 8 bit,但是 UART 协议中包含开始位和结束位,所以每秒钟传输的字节数 = 9600/10 = 960
- 根据计算出的每秒钟传输的字节数,每秒钟传输的比特数是 960*8 = 7680
7. Review
- UART属于哪种类型的通信方式?
- 请绘制出UART通信的硬件接线图。
- 波特率和比特率之间的区别是什么?
- UART在波特率为9600、数据帧格式为默认8-N-1的情况下,发送"Hi",请写出数据帧。(“H” 的 ASCII 值为72, “i” 的 ASCII 值 为105)
- UART在波特率为9600、数据帧格式为 7-E-1 的情况下,每秒传输多少个有效字节?每秒传输多少个有效比特?
参考:
- 超简单的一种通信,2分钟搞懂,串口通讯的工作原理!- B站 - 爱上半导体
- 一文搞懂比特率和波特率 - 知乎 - 奔跑的
- 串口通信8N1 - CSDN - modi000
- UART串口协议详解 - 知乎 - 曾小庆