一文看懂uart串口通信
uart串口的相关概念
文章目录
先看一下一些基础概念
基础概念
串行通信概念
数据位一个bit一个一个传输
串行通信采用单根数据线逐位传输数据。其优势在于布线简单、成本低、抗干扰能力强,尤其适合远距离通信,但传输速率相对较低。
并行通信概念
bit位同时并行传输
并行通信通过多根数据线同时传输多位数据。其主要优点是传输速率高,但需要较多的数据线和硬件支持,成本较高,且因信号间干扰问题,通常不适用于长距离传输。
使用串行通信的一些技术有
uart,i2c,spi,can
常见的串行通信接口包括:UART、USART、I2C、SPI、RS-232、RS-485等。它们各自具有不同的特性和适用场景,例如I2C和SPI适用于板内芯片间通信,而RS-485则支持更远距离的多设备通信。
同步通信和异步通信概念
同步通信需要时钟信号,异步通信不需要时钟信号
比如uart是异步通信,双方设备各自使用自己的时钟,只需要tx,rx来交换数据就可以了,双方根据自己内部的时钟进行数据采样,不需要统一的一条时钟线来规定双方的收发节奏,实际上双方约定的波特率是一条虚拟的时钟线
但是对于i2c协议,则需要一个实际存在的scl时钟线来规定双方数据收发节奏
单工和双工概念
单工通信
方向单向,一方发一方收,数据只能单向传输,如广播。
双工通信
分为半双工和全双工,区别在于在发送的同时能不能同时收
半双工 双方可以互相通信,但不能同时进行(如对讲机)
全双工:双方可同时进行双向数据传输(如电话通话)。
波特率和比特率
比特率 每秒钟传输的二进制位数,单位为比特每秒(bit/s)。
波特率 每秒钟传输了多少个码元
比特率 = 波特率 × 每个码元所包含的比特数。
码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。
若1个码元代表1个比特(如0V表示0,5V表示1),则波特率与比特率数值相等。
若1个码元代表2个比特(如用不同电压表示00、01、10、11),则比特率是波特率的两倍。
常见的通讯传输中,用 0V 表示数字 0,5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1
如果在通讯传输中,有 0V、2V、4V 以及 6V 分别表示二进制数 00、01、10、11,那么每个码元可以表示四种状态
此时,在相同的比特传输速度下,波特率为比特率的一半,表现为使用了更少的带宽,
而在相同的带宽下,提高了一倍的比特率传输速度
好,基础概念这里就结束了,开始具体介绍三大协议,最后比较他们的不同
串口通信
串口通信是一种通过串行接口进行数据传输的方式,普遍用于短距离、低速率的设备间通信。它涵盖了多种协议和物理标准,如UART、USART、RS-232、RS-485等。
UART通信
UART(通用异步收发器)是一种异步串行通信总线,采用两条数据线实现全双工通信,
UART数据帧
通常包含1个起始位(低电平)、5至8个数据位、可选的校验位以及1或2个停止位(高电平)。帧与帧之间由空闲位(持续高电平)分隔。
举例:发送0x55 二进制:01010101
注意这里的字节顺序,低位先行lsb,所以先发1
校验位
用于检测数据传输过程中的错误,常见模式有:
奇校验 (ODD):确保数据位与校验位中“1”的总数为奇数。
偶校验 (EVEN):确保数据位与校验位中“1”的总数为偶数。
1校验 (MARK):校验位恒为1(逻辑高电平)。
0校验 (SPACE):校验位恒为0(逻辑低电平)。
无校验 (NONE):不设置校验位。
注:在某些平台(如部分ARM芯片)中,如需使用校验位,需将字长(word length)设置为9位(1个起始位 + 8个数据位 + 1个校验位)。
如何区分不同数据(如01和0011)?
接收端依靠预先约定并精确同步的波特率来识别每个比特的时长,从而准确解析出起始位、数据位和停止位,进而区分不同的数据内容。
累计误差问题:
由于发送器和接收器使用独立的时钟,即便波特率设置相同,微小的时钟偏差也可能随时间累积导致采样错误。为此,UART通常将单帧数据长度限制在较短范围内(如最多8-9个数据位),通过频繁的起始位重同步来消除累计误差。
UART硬件连接:
UART通常通过TX(发送)和RX(接收)两根线实现交叉互联。配置引脚功能实质上是将芯片内部的物理引脚连接到对应的UART控制器上。
USART
USART(通用同步异步收发器)是UART的功能超集,它不仅支持异步通信,还支持同步通信(需时钟信号)。在实际应用中,异步模式更为常见。其数据帧格式与UART类似。
串口通信是一位一位地传输,每传输一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。
每一个字节的前面都有一位起始位(低电平),后面由7位或8位数据位组成,接着是一位校验位,最后是停止位
停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。
串口驱动流程
使用串口的基本流程如下:
使能USART/UART外设时钟。
配置相关引脚复用到串口功能。
初始化串口参数:波特率、数据位长度、停止位数量、校验位、流控制等。
编写发送/接收函数,或通过重定向标准输出(如实现printf)以便利调试。
为何在USART之外还需I2C、SPI等协议?
尽管USART非常通用便利,但其他通信协议针对特定需求提供了更优的解决方案:
I2C:仅需两根线(数据线和时钟线)即可支持多设备组网,极大节省MCU引脚和PCB布线空间,适合连接多个低速外设。
SPI:采用全双工同步通信,速率显著高于UART,且同样支持一对多连接(通过片选信号选择从设备),适合高速数据交换场景。
RS-232 / RS-485:是物理层标准,常与UART联用。它们通过电平转换和差分信号等技术,极大提升了通信距离和抗干扰能力(RS-232可达15米,RS-485可达千米级),适用于工业环境下的长距离通信。
硬件串口发送流程


串口数据发送并非由CPU直接控制引脚电平,而是通过一组专用的寄存器与硬件电路协同完成的。这个过程的核心是两个关键寄存器:数据发送缓存寄存器 和 状态寄存器。
整体的过程为:
软件查询状态 -> 写入数据 -> 硬件自动完成底层时序和电平转换
如果忽略对TXE状态的检查,在上一字节还未从TDR移入移位器时强行写入新数据,就会发生数据覆盖
整个发送流程的核心是围绕状态寄存器的查询或中断来进行的
整个过程涉及到了两个主要的寄存器
- 核心部件:数据发送缓存寄存器 (TDR - Transmit Data Register),通常只有1个字节(8位)或1个帧(可能包含9位数据+校验位)的宽度
- 监控者:状态寄存器 (SR - Status Register) 这是一个只读寄存器,包含了串口外设的各种当前状态标志位。
TXE (Transmit Register Empty) / TBE (Transmit Buffer Empty):该标志位为 1 时,表明数据发送缓存寄存器(TDR)是空的,可以接受下一个待发送的数据字节。这是发送新数据的前提条件。
TC (Transmission Complete):该标志位为 1 时,表明不仅TDR为空,而且移位器也已经发送完了最后一帧数据的最后一个位(包括停止位),整个发送活动彻底完成。这在需要严格时序控制(如关闭硬件流控制)时非常有用。
串口的标志位

串口数据接收的硬件流程
IDLE中断是判断串口数据接收完毕的标志
当检测到RX引脚空闲(高电平)时间超过传输一个字符帧所需的时间时,产生空闲标志IDLE
串口接收流程

串口接收是一个由专用硬件自动完成的过程,软件只需在合适的时机响应硬件产生的事件并读取数据即可。
- 核心部件:数据接收缓存寄存器 (RDR - Receive Data Register)
虽然发送和接收功能通常共用同一个内存映射地址(在程序里可能都叫USART_DATA),但在芯片内部物理上,往往存在两个独立的寄存器:一个只写的发送数据寄存器 (TDR) 和一个只读的接收数据寄存器 (RDR)。
CPU向该地址写数据,数据进入TDR;CPU从该地址读数据,数据来自RDR。
这样设计简化了编程模型,但逻辑上它们是分开的。
当接收电路成功接收到一个完整的数据字节(或帧)后,会将数据存入此寄存器,等待CPU读取。
- 监控者:状态寄存器 (SR - Status Register)
状态寄存器监控着接收过程,并通过标志位通知CPU。
RXNE (Receive Register Not Empty) / RBNE (Read Buffer Not Empty):这是最重要的接收标志位。当该位置 1 时,表示接收缓存寄存器 (RDR) 中已经存有新的数据,等待CPU读取。CPU读取RDR后,该标志位会自动清零。
IDLE (Idle Line Detected):这就是空闲中断标志。当RX检测到持续高电平(空闲状态)的时间超过一整个数据帧(起始位+数据位+校验位+停止位)的传输时间后,此标志位会被硬件置 1。它标志着一包非连续数据的传输结束,
接收移位器自动将串行电平转换为并行数据。
RDR 是接收数据的临时仓库。
状态寄存器 (SR) 通过RXNE标志告诉有数据,通过IDLE标志告诉一包数据发送完毕。
软件(CPU)响应这些通知,及时读数据并处理完整数据包。
RS232、RS485和USART区别与应用

更多推荐



所有评论(0)