先看一下一些基础概念

基础概念

串行通信概念

数据位一个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移入移位器时强行写入新数据,就会发生数据覆盖
整个发送流程的核心是围绕状态寄存器的查询或中断来进行的

整个过程涉及到了两个主要的寄存器

  1. 核心部件:数据发送缓存寄存器 (TDR - Transmit Data Register),通常只有1个字节(8位)或1个帧(可能包含9位数据+校验位)的宽度
  2. 监控者:状态寄存器 (SR - Status Register) 这是一个只读寄存器,包含了串口外设的各种当前状态标志位。
    TXE (Transmit Register Empty) / TBE (Transmit Buffer Empty):该标志位为 1 时,表明数据发送缓存寄存器(TDR)是空的,可以接受下一个待发送的数据字节。这是发送新数据的前提条件。

TC (Transmission Complete):该标志位为 1 时,表明不仅TDR为空,而且移位器也已经发送完了最后一帧数据的最后一个位(包括停止位),整个发送活动彻底完成。这在需要严格时序控制(如关闭硬件流控制)时非常有用。

串口的标志位

在这里插入图片描述

串口数据接收的硬件流程

IDLE中断是判断串口数据接收完毕的标志
在这里插入图片描述
当检测到RX引脚空闲(高电平)时间超过传输一个字符帧所需的时间时,产生空闲标志IDLE

串口接收流程

在这里插入图片描述
串口接收是一个由专用硬件自动完成的过程,软件只需在合适的时机响应硬件产生的事件并读取数据即可。

  1. 核心部件:数据接收缓存寄存器 (RDR - Receive Data Register)
    虽然发送和接收功能通常共用同一个内存映射地址(在程序里可能都叫USART_DATA),但在芯片内部物理上,往往存在两个独立的寄存器:一个只写的发送数据寄存器 (TDR) 和一个只读的接收数据寄存器 (RDR)。
    CPU向该地址写数据,数据进入TDR;CPU从该地址读数据,数据来自RDR。

这样设计简化了编程模型,但逻辑上它们是分开的。
当接收电路成功接收到一个完整的数据字节(或帧)后,会将数据存入此寄存器,等待CPU读取。

  1. 监控者:状态寄存器 (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区别与应用

在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐