14 UART
在Linux系统中,UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种常见的串行通信接口,用于实现计算机与外部设备之间的数据传输。在19世纪60年代,为了解决计算机和电传打字机通信,Bell发明了 UART协议,将并行输入信号转换成串行输出信号。因为UART简单实用的特性,其已经成为一种使用非常广泛的通讯协议。我们日常接触到的串口,RS232,RS485等总线,内部使用的基本都是 UART协议 。
14.1 UART协议
为了更好的理解和分析UART数据传输,我们通常把一个完整的通讯规范划分成物理层,协议层以及应用层。物理层只定义真实的物理信号特性(比如电压,电流,驱动能力等),以及电信号与逻辑信号0和1的对应关系;协议层不关心底层的0和1具体怎么实现,只规定逻辑信号的协议规范以及通讯过程(例如起始,数据以及结束等);应用层不关心数据是怎么获取的,只定义数据表示的意义,以及如何实现具体的业务逻辑。
最简单的UART协议应用,通常物理层只需要两根传输线,一根用于发送,一根用于接收,从而实现全双工通讯。对于单向传输,也可以只使用一根传输线。此类应用最典型的实例就是单片机的RX/TX端口互相连接,从而实现基于TTL电平的UART通讯。对于不同的传输距离以及可靠性的要求,替换不同的物理层实现既可以得到我们常见的RS232、RS485等通讯总线。
14.2 基于TTL的UART通讯
基于TTL的UART通讯,是UART协议应用最简单的使用场景。即直接把数字I/O输出的高低电平作为实际的物理信号进行传输。在物理连接上,只需要设备共地,通过一根信号线即可完成单向的设备通讯。如果需要双向全双工,使用两根信号线即可。
14.3 UART帧结构
UART协议帧结构的定义, 如下:
当两个设备需要通过UART协议进行通讯时,它们需要同时约定好以下内容:
每一位信号的时间长度T(波特率 = 1/T)
帧结构中每一项的具体位数
是否有校验位,以及校验位的机制(奇/偶/..)
有了这些约定,接收设备只需要等待起始位的到来,再对之后的波形进行固定间隔的采样即可获得传输的具体信息。以字符‘U‘的波形为例,其解析过程如下图所示(无校验位):
14.3.1 波特率
波特率是UART协议,或者说所有异步串行协议,非常重要的一个概念,即单位时间内(1秒)可表示的bit位个数,或者也可以表述为bit位宽的倒数。例如一个波特率为115200的UART波形表示1秒可容纳115200个bit位,也就是说每一位bit数据占大约8.68uS的时长。
UART等异步串行协议,为了简化信号物理连接,降低通讯成本,一般只有一根信号线,无法同时传输数据和时钟信号。收/发设备为了正确解析波形就需要在相同的波特率设置下。而相同的波形使用不同的波特率获取的信息可能会完全不同。对于接收设备来讲,只有起始位可以作为一帧数据的同步点,其它数据都是通过波特率来确定具体的取样位置。
14.3.2 空闲位
设备之间不传输数据时以持续的高电平表示空闲。空闲位持续时间越长,两个数据帧间隔也越长,单位时间传输的数据就越少。
14.3.3 起始位
UART接收端会一直检测信号线上的电平变化,开始传输数据时,发送端将信号线从高电平拉到低电平结束空闲状态,并保持一个bit位的时长。接收器检测到高低电平转换时,开始接收信号。
14.3.4 数据位
数据位包含传输的实际数据,如果使用了奇偶校验,那么数据位长为5 ~ 8 bits,如果没有使用奇偶校验,则位长为5 ~ 9 bits。在一般情况下,数据位为 8 bits,数据首先从最低有效位开始发送,高位在后。
14.3.5 校验位
校验位可以用来提高传输的可靠性。如果信号在传输过程中因为干扰而导致某些位置的电平产生错误,通过计算接收的数据和校验位是否匹配即可判断数据是否有传输错误,从而给应用层提供有效信息来决定接受/丢弃对应的数据。
14.3.6 停止位
停止位表示一帧数据的结束,实际信号是一段时间的高电平。停止位的时间长短可以设置为1、1.5或者2bits的停止位。大部分情况使用1bit的停止位。
因为UART是一个异步协议,每一帧的开头可以用跳变沿来同步,但是停止位只能通过波特率来计算相对位置,如果在停止位的位置识别到一个低电平,则会产生帧错误。在通讯过程中,为了减少波特率的误差导致的问题,可以设置不同的停止位长度来适配。
14.3.7 UART实测波形
这里从Neardi设备上通过UART发送字符'U'到PC, 使用示波器抓图, 如下步骤:
1.) 登录设备, 在终端打开/dev/ttyS7并发送'U'字符, 如下:
root@LPA3588:~# echo -n U > /dev/ttyS7
PC端使用一些通用的UART工具接收即可,参考UART App, 在此忽略。
2.) 使用示波器抓Tx信号波形, 如下:
从波形上可以看出:
起始位(1 bit 低电平): 0
数据位(8 bits): 10101010, 注意是低位-->高位.
校验位: none
停止位(1 bit 高电平): 1
波形数据是0x55, 与发送的'U'字符ASCII码0x55相符合。
14.4 总节
UART协议广泛应用于嵌入式系统、微控制器、传感器和其他需要低速串行通信的设备中,速率高则需要RTS/CTS控制线。
它的主要特点是异步通信,即不需要发送和接收设备之间共享时钟信号。