uart就是我们常说的串口,UART是Universal Asynchronous Receiver Transmitter的缩写,即通用异步收发器,是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。
那么很多初学者在这里会存在这样几个疑问。
1、什么是串行?
这里我们提到了什么是串行,在通信里面按照通信设配每次发送的二进制的个数将通信方式分为串行通信和并行通信两种,但作为学习来讲,我们应该还要了解什么是并行,这里就串行和并行一起讲解。
并行通信
图 1并行通信的示意图
图1就是并行通信的示意图, 例如发送方要方式一个字节的数据,如0x55,转换为二进制为:01010101,那么同步通信就是soc通过8根数据线将这8为数据一次发送给外部设备。
串行通信
图 2 串行通信示意图
串行通信就是通过一根数据线发送数据。如图2所示,如果有一个字节的数据(8位),它需要传递8次,才能将一个字节的数据传递给外部设备。
并行通信和串行通信优缺点对比
并行通信需要的数据线多,线与线之间的干扰较大。
并行通信传递数据满,但干扰小,UART、II2等都是串行通信。
2、什么是异步
先来看这样一个问题,发送方发送01和0011,电平信号都是低电平高电平,那么接收方该如何区分呢?
这个就和波特率有关,波特率表示单位时间发送的数据,根据高低电平时间来确定发送的数据的位数,区别到底是1个1还是两个1。
所谓异步就是指发送方和接收方的时钟不同步。
3、什么是全双工?
在通信中,我们按数据传递的方向将通信分为单工通信和双工通信。
单工通信
单工通信示意图
在单工通信中,将通信双方分为发送器和接收器,在单工通信中,数据只能从发送器发送给接收器,不能从接收器发送给发送器,数据的传递是单向的。
双工通信
与单工通信对立的就是双工通信,双工通信即通信双方A可以给B发数据,B可以给A发数据。双工通信又分为半双工通信和全双工通信。
半双工示意图
在双工通信中,虽然通信双方可以互发数据,但A给B发数据时,B不能给A发送数据,B给A发数据的时候,A不能给A发送数据。
全双工示意图
在全双工通信中,A在B发送数据的时候,B也可以给A发送数据,B给A发送数据的时候,A也可以给B发送数据。
在描述串口通信之前,我们先来看一下如下几个概念。
波特率
波特率是用于描述UART通信时的通信速度。单位为bps,即每秒钟发送bit的数量。注意是描述串口通信时的速率。
UART帧格式
uart帧格式
该图描述了串口通信的过程,发送方先发送一个起始位,起始位表示通信的开始,紧接着发送数据位,数据位发送完了之后发送校验位,最后发送停止位。
注意:串口协议规定,数据线在空闲的时候必须为高电平。这也就是为什么在发送数据之前为什么要先发送一个低电平的起始位的原因。假如没有起始位那么会出现什么样的情况呢,比如要发送0xFF(0x11111111),那么接收方将无法区分发送的数据。它不知道此时是空闲还是在发送数据。
例如:A要通过串口给B发送一个数据,以发送0x55为例。以高电平表示1,低电平表示0。
当接收方收到低电平之后就知道要开始接收数据了,这时候就可以将接收的数据放入到寄存器中了,串口协议规定发送数据的时候要先发送低位。即发送方依次发送10101010。串口协议发送数据的位数可以为5~8位。
数据位发送完之后要发送一个校验位,在数据发送的过程可能会出现失正,为了避免错,因此出现了校验位。
在串口通信中,主要使用的是奇偶校验,以0x55为例,发送方发送了偶数个1,因此向校验位写1,接收方接收数据后,如果发送接收的数据是奇数个1,与校验位数据不匹配,就知道发送过程中出现了错误,接收方就会告诉发送方发送错误需要重新发送。校验位可有可无,如果有的话,通信速度会变慢
停止位表示通信的结束,停止位必须为高电平,可以为1位,1.5位、2位,但是不能没有。