UART(串口)

简介

UART简介:Universal Asynchronous Receiver Transmitter,即通用异步收发器。
是一种通用的串行异步通信总线。
该总线有两条数据线,可以实现全双工的发送和接收。
在嵌入式系统中常用于主机与辅助设备之间的通信。

通信基础

单工、半双工、全双工通信

单工通信:单工通信是一种通信方式,在这种通信模式下,数据只能在一个方向上传输。这就好比是单行道,信息只能从一端发送到另一端,而不能反向传输。
例如,传统的广播电台就是单工通信的典型例子,广播电台可以向听众发送信号,但是听众无法向电台发送信号。
半双工通信:半双工通信是一种通信方式,它允许数据在两个方向上进行传输,但不能同时进行。就好像是一条单车道的桥,车辆(数据)可以从桥的这头开到那头,也可以从那头开到这头,但同一时间只能有一个方向的车辆通行。
例如,对讲机通信就是半双工通信,当一方在说话(发送数据)时,另一方只能听(接收数据),等一方说完后,另一方才能回应。
全双工通信:全双工通信是一种通信方式,允许数据同时在两个方向上传输。这就好比是有两条并行的车道,车辆(数据)可以在两个方向上同时行驶,互不干扰。
例如,电话通信就是典型的全双工通信,双方可以同时说话和聆听,实现实时的、双向的信息交流。

并行和串行

并行通信:并行通信是一种数据通信方式,它使用多条数据线同时传输多个数据位。就好像是有多条车道的高速公路,车辆(数据位)可以同时在这些车道上并行前进,一次性传输多个数据位,从而提高了数据传输的速度。
例如,对于一个 8 位的数据字节,就会使用 8 条数据线同时传输这 8 个数据位。
优点:高速传输,简单直观。
缺点:硬件成本高,抗干扰能力弱,传输距离受限。
串行通信:串行通信是一种数据通信方式,它是将数据按位(bit)依次进行传输,每次只传输一位数据,数据在一条数据线上按时间顺序一位接一位地传送。这就好比是单车道的道路,车辆(数据位)只能一个接一个地行驶。
例如,对于一个 8 位的数据字节,就会使用1条数据线依次按序传输这 8 个数据位。
优点:硬件成本低,抗干扰能力强。
缺点:传输速度相对较慢,通讯协议复杂。

硬件连接

串口(UART)主要包括发送端(TX)和接收端(RX)引脚,以及一些辅助引脚(如地线 GND)。在最简的连接场景下,两个设备进行串口通信时,发送端和接收端交叉连接,即一个设备的 TX 连接到另一个设备的 RX,同时两个设备的 GND 相连,以确保信号有共同的参考电平,避免出现信号混乱。
例如:设备A的发送端,要连接在设备B的接收端,相同的,设备B的发送端,要连接在设备A的接收端。

波特率

波特率:波特率用于描述UART通信时的通信速度,其单位为bps(bit per second)即每秒钟传送的bit的数量。在串行通信中,bit是指一个固定时长的信号波形,它可以代表二进制中的一位(0 或 1)。
例如,波特率为 9600 时,每秒可以传输 9600 个bit;如果提高到 115200 ,数据传输速度就会显著提高,每秒可以传输 115200 个bit。
强调解释:如果一秒传输一个bit,则波特率就是1bps,同样的,如果传输一位bit(0 或 1)花费的时间也需要1秒,如果波特率是9600,则传输一位bit花费的时间则为1/9600秒。
扩展知识:一个字节(Byte)有8位(bit),波特率是以位(bit)为单位,传输了8个bit,相当于传输了一个字节。

串口(UART)帧格式

串口帧格式分四类:起始位、数据位、奇偶校验位、停止位。

起始位

起始位是串口帧格式的开头标志,用于通知接收端数据传输即将开始。它是一个逻辑 0 电平,其持续时间通常为一个bit周期。当接收端检测到这个逻辑 0 电平的起始位时,就会开始准备接收后续的数据位。
扩展:为什么起始位信号是0电平?
对于串口总线来说,串口总线空闲时电平为高电平(用1表示),空闲就是,没有收发任务时的状态,这时,突然表示要发送数据,如果起始信号用高电平来表示,则会因为本来就是高电平,再来一个高电平,就无法准确通知接收端要开始一段通信。

数据位

数据位是串口帧中真正包含有效数据的部分,紧跟在起始位之后。数据位的数量可以是 5 位、6 位、7 位或 8 位,具体取决于通信双方的设置。在大多数通用的串口通信中,常采用 8 位数据位,这是因为 8 位数据位可以方便地表示一个字节的数据,能涵盖 ASCII 码字符、无符号整数(0 - 255)等多种数据类型。
数据编码与传输顺序:数据位按照从最低位(LSB - Least Significant Bit)到最高位(MSB - Most Significant Bit)的顺序依次传输。
例如,如果要传输一个字节0x55十六进制的数据(二进制:0101 0101),那么首先传输的是最右边的 1(LSB),最后传输的是最左边的 0(MSB)。
一个字节有八位,从左至右,位置分为为bit[0]位~bit[7]位,同样以0x55为例

十六进制 二进制
一个字节 bit[7] bit[6] bit[5] bit[4] bit[3] bit[2] bit[1] bit[0]
0X55 0 1 0 1 0 1 0 1
bit[7]位为最高位,bit[0]为最低位,按照串口协议,发送数据位时,是先发送最低位,即先发送bit[0]位,最后发送bit[7]位,以下,以波形进行示例。
对以上过程进行总结(假如波特率为9600bps,则发送1个高/低电平时间需要1/9600秒)
  1. 串口空闲时,电平保持高电平,一直为1;
  2. 开始发送数据时,先发送一个起始位(0电平,持续时间1/9600秒),告诉接收端开始了通讯;
  3. 起始位发送后,数据位便紧接着开始发送,LSB低位先发,0X55二进制为0101 0101
    从右至左开始发送,每位占用时间1/9600秒。
  4. 校验位和停止位的概念在下边,在这里,我们先多提一下,假如我们是偶校验,则这里校验位应该发送低电平(0),持续时间也是1/9600秒,随后的停止位便是一个持续的高电平组成,持续时间可以是1位,1.5位或2位bit周期,假如这里是2位bit周期,则停止位占用时间是2/9600秒。
    由此可得,在9600bps下,发送一个数据帧,需要时间为1/9600(起始位)+8/9600(数据位)+1/9600秒(校验位)+2/9600秒(停止位)=12/9600秒=1.25毫秒。
    如果不使用校验位,则耗费时间减少1/9600秒,速度将会更快。

奇偶校验位

是否使用奇偶校验位是可选的,用于简单的错误检测。它是根据数据位中 1 的个数来设置的。
例如:如果传输一个字节数据0X55(十六进制),0X55转换成二进制为0101 0101共计8位,这也对应一个字节数据有8位的概念,如果我们选择偶校验,由于数据中共有4个1,4为偶数,则该校验位应传输0,若该数据中有奇数个1,在选择偶校验情况下,该校验位应为1。

停止位

停止位是串口帧的结束标志,紧跟在数据位和奇偶校验位(如果有)之后。它是一个逻辑 1 电平,其持续时间可以是 1 位、1.5 位或 2 位bit周期。停止位的作用是让接收端知道一帧数据已经传输完毕,并且使接收端有足够的时间来处理接收到的数据,为下一次接收数据做准备。

串口(UART)典型问题

假如A向B发送一个01或者0011或者000111时,都是低电平再高电平,B是怎么判断信号是01、0011还是000111的?
对于串口来说,收发双发没有SCL这个时钟线,说明双方是时钟不同步的异步方式通信。

对于异步通信,通信双方必须要约定好波特率,则B可以掐时长的方式来判断,A是发送了几位数据。

如果约定波特率为1bps,则发送一位数据需要1s,B可以根据低电平的持续时间来判断该低电平包含了几位0,若该低电平持续2S,则该低电平信息为00。