UART通信协议

此文转自:http://blog.sina.com.cn/s/blog_78e87ba10102wj71.html

对很多接触过单片机的朋友们来说,UART一定不是一个陌生的东西,因为往往许多人将UART作为程序调试反馈的一个重要途径,而UART协议也成为了目前最通用的协议之一。至于UART的来历,其实更多的是对RS232的继承和发展。早期的电脑基本上都是通过RS232协议进行通讯,采用的接插件为DB25。后来随着PC机的发展,许多厂商更偏向于生产小型化的接口,而IBM电脑在上世纪八九十年代的盛行更是将DB9接插件变成了PC机的标配。而随着移动设备的多样化和多量化,许多非RS232的设备也需要接入PC机,故最好的方式就是RS232接口的设备和非RS232接口的设备都通过RS232接口接入PC机。所以UART里面的U(Universal)也是这个意思。所以现在的PC机虽说外部都采用的是UART,但实际上内部还是使用了RS232的接口。

       现在基本上所有的单片机、处理器等都是由硬件控制UART的收发,用户只需在程序里调用芯片厂商编写的API函数即可对UART进行控制。虽说硬件已经帮我们解决了绝大部分的事情,但对于UART的概念以及UART的通讯时序,我觉得还是需要去理解和领会的。以下是我对于UART通信协议的理解,若有不对的地方,欢迎广大读者指正。

//---------------------------------------------华丽的分割线------------------------------------//

       UART(Universal Asynchronous Receiver/Transmitter),通用异步(串行)收发器,主要由两根信号线进行通信:RXD、TXD。值得注意的是,UART通信并不存在时钟线,也就是说,UART是一种异步通信协议。对于两个设备要通过UART进行通信,则接口如下图所示:

UART通信协议

图1 UART设备连接图

UART在空闲时,两条通信线均为高电平状态。UART通信的单位为一个帧,一个帧里面包含起始位、数据位、奇偶校验位和停止位,如下图所示:

UART通信协议

图2 数据帧格式

·起始位:起始位为一个周期的低电平,接收端在检测到起始位之后开始一次UART通信;

·数据位:发送的数据内容存放至该码段中,低位优先。数据的位数常规来说为8位,根据不同的               硬件设计也可以有不同的位数选择,但一般来说不超过11位;

·奇偶校验位:分为奇校验和偶校验,该校验针对的为数据位的校验,该位为对数据正确性的一个                 验证。发送端选择奇校验时,硬件判断数据位中的1是否为奇数,若为奇数则将奇偶校验               位置0,若为偶数则将奇偶校验位置1。接收端接收到数据后判断数据位和奇偶校验位中                 的1的个数是否满足奇偶校验。若1的个数为偶数,则满足偶校验;若1的个数为奇数,则               满足奇校验。

·停止位:停止位常规来说为一个或两个周期的高电平,标志本次UART通信结束。

       举个例子吧,若一个设备想向另外一个设备发送一个八位数据(10010110),要求满足奇校验,停止位为1个周期长度,则发送端的波形如下:

UART通信协议
 

图3 波形图-1

       由图可看到,在一个起始位的开始后,紧接着一个8位的数据,但注意到的是先发送的是低位,最后发送的是高位。这8位数据中,有4(偶数)个1,故不满足奇校验,应在奇偶校验位上置1,使得整个数据中1的个数为奇数。同样的,若要使得通信满足偶校验,由于数据位中已经有偶数个1,故奇偶校验位置0即可满足偶校验。

       在UART中,另外一个很重要的指标为波特率(Baud Rate),这个指标衡量的是UART通信的速度。但在这里有两个概念需要区分,那就是比特率和波特率,许多人经常把这两个概念给混淆。

       波特率的定义为单位时间内传输的码元的个数,而比特率的定义为单位时间内传输的比特的个数。故波特率又称为码元速率。那么码元又是什么呢?码元是承载信息量的基本单位,用时间间隔相同的符号表示一个多进制数,这个符号就为码元。(摘自百度百科)这么理解吧,对于UART来说,若电平标准为TTL,则5V表示1,0V表示0。则一个码元可以表示一位二进制数字。此时波特率等于比特率。而对于另外一种系统,0V表示00,2V表示01,4V表示10,6V表示11,这样的系统的码元则可以表示两位二进制数字。则波特率为比特率的1/2。也就是说一个码元能够表示多少位2进制数,则波特率等于比特率乘以这个二进制数的位数。

       综上所述,我们可以总结出UART通信的特点:

       1.通信数据线少,比较节约IO资源;

       2.通讯协议简单,硬件设计复杂性较低;

       3.通讯速率较低;

       4.通信效率不高;

       5.抗干扰性差。

       针对第3、4点,由于UART通信不存在时钟线对数据进行同步,故在通信前需要对波特率进行一个约定才能完成正常通信。正是由于没有时钟线同步,接收端在对数据进行采样时,就算约定了速率,但由于两者之间的时钟再怎么样都会有误差(除非你用原子钟...),所以无法完成一个持续的长时间采样,在每次起始位到来时接收端都会对采样时钟相位进行一次校准,故无法完成高速率通信的要求。而起始位、奇偶校验位和停止位的占用,使得整个带宽会有一定的牺牲,例如要传输8位数据,完成奇或偶校验,停止位为1位,则通信效率为8/11≈72%,若传输数据位数再少一点则这个效率更低,所以UART节省IO口的代价就是牺牲了一部分的带宽,这也是异步通信的弊端。现在的许多通信协议为了提高速率,大多都会采用一根时钟线来进行同步,除非像USB或者光线那样的高速通信设备,将时钟信号植入了数据信号当中。

       总的来说,UART还是个非常好用的通信协议,市面上许多的模组也都采用的UART作为通信接口。以上的叙述都是个人的浅见,若有发现不对的地方,欢迎指正,我也一定虚心请教~

猜你喜欢

转载自blog.csdn.net/qq_42384937/article/details/83143915