摘要:本文介绍UART通信协议的基本知识
前面已经了解并多次使用IIC通信协议了,那是一个同步、半双工、串行通信协议。今天来了解一个用途非常广泛的通信协议——UART。
UART(Universal Asynchronous Receiver/Transmitter)的中文名称为通用异步收发传输器。从名字就可以看出,它是一个异步数据传输的通信协议。在前面的文章中已经介绍过了,同步通信和异步通信的区别就是看有没有时钟线,如果在数据传输过程中,需要使用到数据同步信号,那么这个数据传输就是同步传输,如果传输过程中,不需要使用到同步信号,那么,这个数据传输就是异步的。
买过或者组装过台式机的都知道,电脑都是有串口的。早期的鼠标也都是串口的,那个串口也被称作RS232接口,随着科技的发展,串行接口逐步被USB接口和蓝牙接口所替代。那么,这个RS232串口和UART是什么关系呢?UART是串行异步通信口的总称,而RS232则是异步串行通信的接口标准和总线标准,它定义了异步串行通信接口的电气特性、传输速率、连接特性和接口的机械特性等内容。为了适应不同的应用场景,这种串行接口的标准还有RS485、RS422等等多个。但这些都属于异步串行通信接口的范畴,相当于是UART通信协议的一种实现。
在使用ESP32进行程序上传的时候,虽然与ESP32开发板是通过USB线连接到电脑的。但实际上底层也是UART通信协议来与ESP32芯片进行通信的。在当初调试第一个ESP32程序的时候,首先就是要安装一个USB转串口的驱动,这就是因为芯片支持的是UART通信来上传程序,因此在开发板上有一个串口转USB的芯片,安装驱动程序之后会在电脑内添加一个串口。之后,就可以利用这个串口来与芯片进行通信了。
UART通信是有三种通信模式的,全双工模式、半双工模式和单工模式。全双工是指收发两端可以同时发送和接收数据,这就需要至少有2根数据线来分别完成收发工作。半双工是指虽然通信双方都可以进行数据的接收和发送,但在同一时刻,只能有一方发送另一方接收,也就是收发工作不能同时进行,这种情况收发设备之间只需要一根数据线就可以了。单工就是只能进行单向的数据传输。一方只能发送,另一方只能接收。
UART不使用时钟线如何保证接收者能够正确的识别发送过来的每一个数据的呢?UART是一个串行通信协议,因此,发送数据也是一位一位的串行发送的。那么如果没有时钟信号线作为指定每一位的标识时,就收发双方事先定好数据传输的时序。也就是需要事先规定好每一位数据的时长以及整个数据传输的格式,这样,接收设备就需要按照约定的周期去读取数据,在按照约定的格式解析出所传递的数据。这个读取数据的周期的倒数就是频率,在通信领域有个专有的名词,就是波特率,表示一秒钟可以发送数据的位数。下面就来看一下通信数据的格式规定。
UART的数据传输是以帧位单位的,每一个数据帧包含了一个起始位、5-8位的数据位、可选的校验位和停止位组成。如下图所示:
通过上图可以看到,UART的数据线在空闲时是高电平的,在发送数据之前先发送一个起始位“0”,然后再依次发送数据位,数据位发送完之后,是可选的一位校验位,最后是停止位,停止位用高电平“1”来表示,它的宽度可以是1位、1.5位或者2位。停止位结束后,可以进行下一个数据帧的发送工作。
数据传输的时候,绝大部分设备都是低位在前,高位在后。这已经称为一个约定俗成的习惯了,但也不是绝对的。其实在所有的串行数据传输中都有这个问题,在早期的开发中,在不同的系统进行数据交换时会遇到不一致的情况,这个问题现在已经很少见了。
好了,UART的基础知识就介绍到这里了,接下来会讲一下在Android中,如何进行异步串行通信。