最详细的 UART协议 分析在这里!

1. 协议基础

1.1.    协议简介
  UART是“Universal Asynchronous Receiver/Transmitter”,通用异步收发器的缩写。在19世纪60年代,为了解决计算机和电传打字机通信,Bell发明了UART协议,将并行输入信号转换成串行输出信号。因为UART简单实用的特性,其已经成为一种使用非常广泛的通讯协议。我们日常接触到的串口,RS232,RS485等总线,内部使用的基本都是UART协议。

为了更好的理解和分析协议与总线的关系,我们通常把一个完整的通讯规范划分成物理层,协议层以及应用层。物理层只定义真实的信号特性(比如电压,电流,驱动能力等),以及电信号与逻辑信号0和1的对应关系;协议层不关心底层的0和1具体怎么实现,只规定逻辑信号的协议规范以及通讯过程(例如起始,数据以及结束等);应用层不关心数据是怎么获取的,只定义数据表示的意义,以及如何实现具体的业务逻辑。

最详细的 UART协议 分析在这里!_第1张图片

                                                        图 1‑1 通讯协议的分层实现


     最简单的UART协议应用,通常物理层只需要两根传输线,一根用于发送,一根用于接收,从而实现全双工通讯。对于单向传输,也可以只使用一根传输线。此类应用最典型的实例就是单片机的RX/TX端口互相连接,从而实现基于TTL电平的UART通讯。对于不同的传输距离以及可靠性的要求,替换不同的物理层实现既可以得到我们常见的RS232、RS485等通讯总线。

1.2.   不同的物理层实现
     由于UART协议层的输入是逻辑0/1信号,而逻辑0/1信号在物理层可以通过不同的电平标准来区分。针对不同的通讯需求,便可以使用不同的物理层实现。例如简单的板内通讯,或者常见的设备调试场景,使用简单的LVTTL/TTL电平即可在两个设备间进行UART协议通讯。

最详细的 UART协议 分析在这里!_第2张图片

                                                           图 1‑2 不同的物理层电平标准
      

      通用的串口则使用的是RS232电平,可以增加传输距离,并且抵抗一定程度的信号干扰。付出的成本则是在物理层需要对应的电平转换芯片来实现,发送端需要将内部的高低电平信号转换成电压更高的+/-电压信号,接收端需要将+/-电压信号转换成内部的高低电平信号。

在工业通讯的场景下,为了进一步提高传输距离,以及增强信号的可靠性,一般会采用RS485的电平标准。在发送端将普通的高低电平信号转换成一对差分信号,在接收端将差分信号再转换成普通的高低电平信号。另外,RS485允许总线上连接多达128收发器,而TTL或者RS232则是点对点的连接。

1.2.1.    基于TTL的UART通讯
     基于TTL的UART通讯,是UART协议应用最简单的使用场景。即直接把数字I/O输出的高低电平作为实际的物理信号进行传输。在物理连接上,只需要设备共地,通过一根信号线即可完成单向的设备通讯。如果需要双向全双工,使用两根信号线即可。

   最详细的 UART协议 分析在这里!_第3张图片

                                                               图 1‑3 基于TTL的UART通讯


     为了对比不同物理层实现的差别,我们可以观察发送相同数据时,不同物理层的实际信号有何不同。这里以发送字符‘D‘为例,通过璞石示波器,直接观察TTL实现传输的信号(探头接地端连接设备共地端,探头信号端连接上图蓝色信号线),可以获得如图 1‑4所示的信号波形。从波形可以看出,当没有数据传输时,UART信号会一直保持在高电平(具体信号幅度由I/O的供电电压决定),数据传输时信号发生跳变,传输完成后信号重新回到空闲的高电平状态。

最详细的 UART协议 分析在这里!_第4张图片

                                                             图 1‑4 TTL的UART信号波形


1.2.2.     基于RS232的UART通讯
      为了增强驱动能力,以增加传输距离和可靠性,RS232总线采用了双极性电压信号来进行物理传输。信号在发送/接收之前,通过电平转换芯片实现内部信号和总线信号的互相转换。连接方式和TTL电平完全相同,整个物理层只是多了一层电平转换。

最详细的 UART协议 分析在这里!_第5张图片

                                                         图 1‑5 基于RS232的UART通讯


同样以发送字符‘D‘为例,璞石示波器的探头连接到信号端,可以采集到如图 1‑6所示的实际波形。可以看出,RS232波形在空闲时为负电压,当有数据传输时,信号开始在正负电压之间跳变,传输完成后重新回到空闲的负电压状态。

最详细的 UART协议 分析在这里!_第6张图片

                                                         图 1‑6 RS232的UART波形


1.2.3.     基于RS485的UART通讯
      RS485为复杂的工业环境而设计,和其它UART协议的物理层相比,RS485总线最大的特点就是使用了差分信号传输。信号在发送之前,通过RS485的收发器把单端信号转换成差分信号,再发送到总线上进行传输;同样在接收之前,总线上的差分信号通过收发器的转换变成单端信号再送给UART控制器进行接收。在RS485总线上,如果希望进行全双工的双向通讯,需要两对差分信号线(即4根信号线)。如果只进行半双工的双向通讯,则仅需要一对差分信号即可。

最详细的 UART协议 分析在这里!_第7张图片

                                                        图 1‑7 基于RS485的UART通讯


      还是以发送字符‘D‘为例,使用璞石示波器2个通道的探头(共参考地),分别连接到其中一对差分信号的A/B端,可以采集到如图 1‑8所示的实际波形。可以看出,A/B端的波形为互补关系。A端波形为正向逻辑(空闲时为正电压),B端波形为反向逻辑(空闲时为负电压)。

最详细的 UART协议 分析在这里!_第8张图片

                                                              图 1‑8 RS485的UART波形


2.        协议规范


2.1.      UART帧结构
      在上一节的介绍中,我们通过璞石示波器观察了实际的UART波形,那么这个波形到底是怎么被准确的识别成字符‘D‘,而不是其它内容的呢?这就涉及到UART协议帧结构的定义。如图 2‑1所示:

                                                            图 2‑1 UART协议帧结构


   当两个设备需要通过UART协议进行通讯时,它们需要同时约定好以下内容:

每一位信号的时间长度T(波特率 = 1/T)

帧结构中每一项的具体位数

是否有校验位,以及校验位的机制(奇/偶/..)

有了这些约定,接收设备只需要等待起始位的到来,再对之后的波形进行固定间隔的采样即可获得传输的具体信息。以字符‘D‘的波形为例,其解析过程如图 2‑2所示:

最详细的 UART协议 分析在这里!_第9张图片

                                                                图 2‑2 UART波形分析
           

2.1.1.     波特率
      波特率是UART协议,或者说所有异步串行协议,非常重要的一个概念,即单位时间内(1秒)可表示的bit位个数,或者也可以表述为bit位宽的倒数。例如一个波特率为115200的UART波形表示1秒可容纳115200个bit位,也就是说每一位bit数据占大约8.68uS的时长。

                                                                     图 2‑3 波特率的定义


       UART等异步串行协议,为了简化信号物理连接,降低通讯成本,一般只有一根信号线,无法同时传输数据和时钟信号。收/发设备为了正确解析波形就需要在相同的波特率设置下。而相同的波形使用不同的波特率获取的信息可能会完全不同。对于接收设

你可能感兴趣的:(单片机,嵌入式硬件)