- UART:Universal Asynchronous Receiver/Transmitter 通用异步收发传输器
通用,体现在其被广泛使用上,几乎所有的SOC中都集成了UART外设接口;
异步,表明通信双方不使用共享时钟信号,而通过约定的波特率来保持同步;
收发,说明它同时具备数据发送和数据接收两个方向的能力。
同步通信(Synchronous) 在数据传输的双方之间有一条专用的公共时钟线,发送方根据时钟脉冲将数据送出,接收方在时钟脉冲的边沿(上升沿或下降沿)对数据进行采样。同步通信可以发送连续的数据流而不需要额外多余的位,时序简单可靠,可以达到很高的速率。SPI、IIC就是同步串行通信的典型代表。
异步通信(Asynchronous) 则没有公共时钟线。收发双方各自拥有独立的时钟源,按照事先约定好的传输速率(即波特率),使用各自的时钟来发送和采样数据。由于没有时钟线,接收方必须依靠数据本身的特征来判断一帧数据何时开始、何时结束——这就引出了UART协议中起始位和停止位的设计。
波特率用于描述通信时的数据传输速度,其定义为:每秒传输的码元Symbol数量,单位是波特(Baud)
在UART通信中,每个码元恰好对应一个二进制位(一个码元只有高/低电平两种状态,即一个bit的信息),所以波特率在数值上等于比特率(Bit Rate),单位可以写成bps(bits per second)。 - UART帧格式

1、空闲状态
UART不传输数据时,总线保持高电平,称之为空闲状态,数据帧开始前处于空闲状态,结束后也会回到空闲状态。UART空闲状态为高电平,是为了:
兼容RS232传统标准;
方便识别断线、掉电故障;
用高→低跳变作为清晰的起始位标志。
2、起始位
起始位固定为1bit,固定为低电平,不可配置。当发送方要开始发送一帧数据时,它将Tx线从高电平拉低到低电平,并保持1bit的时间。这个1bit时长的低电平就是起始位。起始位用于通知接收方马上会发新的一帧数据。当接收方检测到Rx线从高到低的跳变时,它就知道对方要开始发送数据了,于是按照约定的波特率,在恰当的时刻去采样后续的每一个比特。
3、数据位
紧跟在起始位之后的就是实际要传输的数据位。数据位的长度可以选5~8 bit,最常用的是8bit,有些实现还支持9bit,用于指示是否为地址帧(也可以有其他用法)。数据位的发送采用LSB First,即LSB最先发送,MSB最后发送。
4、校验位
UART数据帧可以选择有校验位或无校验位,如果有则占1bit。校验位位于数据位之后、停止位之前,用于检测数据的正确性,但是不能纠错,可以配置为以下几种模式:
无校验:None,不发送校验位,帧中没有这一段,这是最常用的配置;
偶校验:Even Parity,整个数据位加上校验位中"1"的个数为偶数;
奇校验:Odd Parity,整个数据位加上校验位中"1"的个数为奇数。
举例说明偶校验:发送数据 0x35('b00110101),其中"1"有4个,已经是偶数,所以校验位为0。发送数据 0x37('b00110111),其中"1"有5个,是奇数,为了凑成偶数,校验位须为1。
5、停止位
停止位可以配置为 1 / 1.5 / 2 bit,最常用的是1bit。数据位(和可选的校验位)发送完毕后,发送方将Tx线拉回高电平,并保持至少1bit时间,这就是停止位。停止位的作用有两个:标志一帧数据的结束;为接收方提供重新同步的机会。 停止位之后,线路回到空闲状态,它给接收方提供了处理已接收数据的短暂缓冲时间,并且接收方可以准备接收下一帧的起始位。 - UART物理连接
UART协议在最简化的应用中只需要TX和RX两根数据线。但在完整的RS-232串行通信标准中,UART接口定义了多达8根信号线,它们各自承担不同的职责。
1、数据信号线
TXD(Transmit Data,发送数据线)
UART模块内部的发送移位寄存器(Transmit Shift Register)将并行数据逐位移出,形成符合UART帧格式的串行比特流,通过TXD送出。
RXD(Receive Data,接收数据线)
UART模块内部的接收移位寄存器(Receive Shift Register)持续监测RXD的电平变化。当检测到起始位的下降沿时,接收逻辑被触发,开始按照预设的波特率对后续的比特进行采样,逐位移入移位寄存器,最终拼装成一个完整的字节数据送入接收FIFO。
2、硬件流控信号线
当通信双方的数据处理速度不对等时,比如发送方持续高速发送,但接收方因为在处理中断、执行耗时任务或FIFO快满了而来不及取走数据——就会发生数据溢出,导致数据丢失。硬件流控就是用来解决这个问题的机制。
RTSn(Request To Send,请求发送)
RTS是接收方输出给发送方的信号,末尾的n表示这是一个低电平有效信号:RTS=低电平(有效):接收缓冲区空间充裕,可以发数据过来;RTS=高电平(无效):接收缓冲区空间不足,请停止发送;硬件实现中,当UART接收FIFO中的数据量超过了预设的阈值,硬件会自动将RTS拉高,通知对方停止发送。当FIFO中数据被读走、水线降到阈值以下后,硬件又自动将RTS拉低,通知对方可以继续发送。整个过程不需要软件干预,这就是"硬件流控"这个名字的由来。
CTSn(Clear To Send,清除发送)
CTS是RTS的对端信号,是硬件用来判断自己能不能继续发送的依据:CTS=低电平(有效):对方告诉我可以发送;CTS=高电平(无效):对方要求我停止发送;硬件实现中,当UART发送器检测到CTS为高电平时,即使发送FIFO中还有待发送的数据,发送器也会暂停发送。等CTS变为低电平后,发送器自动恢复发送。设备A的RTS连接到设备B的CTS,设备B的RTS连接到设备A的CTS,任何一方都可以通过拉高自己的RTS来通知对方暂停发送,对方的CTS检测到这个变化后就会暂停其发送器。
3、调制解调器控制信号
DTRn(Data Terminal Ready,数据终端就绪)
DTR是DTE设备(如计算机)用来告知对方已经上电并准备好通信了的信号:DTR=低电平(有效):终端已上电并初始化完毕,告知Modem可以通信;DTR=高电平(无效):终端尚未就绪或已关闭;
DSRn(Data Set Ready,数据设备就绪)
DSR是DTR的握手信号,是通信设备(如调制解调器)告知终端已经准备就绪:DSR=低电平(有效):调制解调器已经上电并准备好工作了;DSR=高电平(无效):调制解调器尚未就绪DTR与DSR构成一对双向握手:终端通过DTR说"我好了",调制解调器通过DSR说"我也好了"。双方都就绪后,才能开始真正的数据通信。
DCDn(Data Carrier Detect,载波检测)
DCD是调制解调器专用信号,用来告知终端"电话线路上已经检测到对方调制解调器的载波信号,物理链路已建立:DCD=低电平(有效):载波已检测到,链路已建立,可以传输数据了;DCD=高电平(无效):未检测到载波,链路中断;
RIn(Ring Indicator,振铃指示)
RI用来告知终端电话线路上检测到振铃信号(来电):RI=低电平(有效):有来电,电话正在响;RI=高电平(无效):没有来电。 - TTL电平
TTL是一个电气标准,用0V表示逻辑0,用3.3V或5V表示逻辑1。芯片引脚上直接输出的UART信号通常就是TTL电平。
UART是串行通信协议,其定义的是数据帧的格式和时序逻辑(协议层面),而TTL、RS232、RS485定义的是电压高低的物理标准(电气层面)。 UART信号要传输到外部世界,必须选择一种电气标准。直接从芯片引脚出来的UART信号是TTL电平;如果要通过RS232传输,需要加一颗电平转换芯片(如MAX3232);如果要通过RS485传输,需要加RS485收发器芯片。 - RS232
RS232是最早的基于UART通信协议的电气标准,用+3V+15V表示逻辑0,用-3V-15V表示逻辑1。同时RS232定义了物理接口标准,使用DB9接口。RS232抗干扰能力较差,传输距离短,它的优势在于支持全双工通信,适用于两个设备之间的直接、低速数据交换。 - RS485
RS485也是电气标准,区别在于其使用差分信号,用两线间的电压差为+2V+6V表示逻辑0,用电压差为-2V-6V表示逻辑1。由于信号电平比RS232降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL 电路连接。差分信号的使用也使其抗干扰能力更强,传输距离更远,并且支持多设备挂载在同一总线上。RS485并未规定物理接口标准,可以根据工程的实际情况选择。


SOC外设接口之UART
发布于
2026-04-03
|
10分钟
|
2577字数
赞赏
- 本文作者: 枫
- 本文链接: https://mygithubma.github.io/FzeXZLJMXk/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
0%
x
感谢您的支持,我会继续努力的!
扫码打赏,你说多少就多少