【STM32】 初认识USART串口


USART 串口详解

1. 什么是 UART?

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器) 是一种把并行数据与串行数据互相转换的硬件外设,也是一套异步串行通信约定。

  • 串行:数据在一根线上一位一位地传,用时间换引脚数量。对比并行总线(8 根数据线同时传),串口只需 TX/RX 两根线,成本低、线缆少、抗干扰相对好。

  • 异步:收发双方没有共享时钟线,各自用自己的时钟,靠事先约定的波特率对齐每一位的时长。

  • 全双工:TX、RX 独立,可同时收发。

  • 点对点:一个发送端对一个接收端(多机需走地址模式或 RS-485 总线)。

  • 物理层 + 数据链路层的混合体:UART 既规定了"电平怎么表示 0/1"(物理层),又规定了"一帧怎么打包"(数据链路层),但没有规定上层协议(帧头、校验、重传要自己做)。

一句话:

串口 = 把一个字节拆成一位一位,按约定的节奏(波特率)和格式(帧格式)在两根线上送出去、再拼回来。


2. 初步理解 UART 定义

2.1 内部结构

复制代码
               ┌────────────── USART 外设 ──────────────┐
 CPU 总线 ◄──► │ 发送数据寄存器 TDR(并行,1 字节)       │
               │        │ 自动搬运                       │
               │        ▼                               │
               │  发送移位寄存器 ──逐位──► TX 引脚       │
               │                                        │
               │  RX 引脚 ──逐位──► 接收移位寄存器        │
               │        │ 自动拼装                       │
               │        ▼                                │
               │  接收数据寄存器 RDR(并行,1 字节)──► CPU│
               │                                         │
               │  波特率发生器(BRR + 分频)              │
               │  控制寄存器 CR1/CR2/CR3                  │
               │  状态寄存器 ISR(TXE/TC/RXNE/ORE...)    │
               └────────────────────────────────────────┘

双缓冲:

发送/接收各有"数据寄存器 + 移位寄存器"两层。

数据寄存器对接 CPU(并行),移位寄存器对接引脚(串行)。

这样在移位输出当前字节的同时,CPU 就能准备下一个字节,效率更高。


2.2 发送一个字节的完整过程(以 0x41 = 'A' 为例)

  1. CPU 把 0x41 写入 TDR,硬件立即把它搬到发送移位寄存器,同时置 TXE(TDR 空,可以写下一个)。
  2. TX 线上先输出起始位(低电平 1 位)。
  3. 依次移出 D0~D7,低位在前(LSB first):1、0、0、0、0、0、1、0。
  4. 输出校验位(若配置)、停止位(高电平)。
  5. 整帧完全移出后置 TC(传输完成),线回到空闲高电平。

2.3 接收端如何"对准"每一位------过采样

没有时钟线,接收端靠**过采样(oversampling)**自己对表:

  • STM32 默认 16 倍过采样:一个数据位期间有 16 个采样时钟。
  • 检测到起始位下降沿后开始计时,在每位的第 8、9、10 个采样点(位中心附近)采 3 次,3 选 2 多数表决确定该位。
  • 作用:抗毛刺、抗抖动,并容忍一定波特率误差。

2.4 通信成立的四个前提

波特率、数据位数、校验方式、停止位数------收发两端必须完全一致,否则乱码或收不到。


3. MCU 和串口

3.1 串口属于 MCU 片上外设

串口不是软件模拟出来的(虽然也能软件模拟),而是 MCU 芯片内部集成的一块独立硬件(片上外设/IP 核),和 GPIO、定时器、ADC 一样挂在总线上:

  • 独立硬件工作:一旦配置好,移位、采样、帧打包/解包、波特率计时全部由硬件自动完成,不需要 CPU 逐位参与。CPU 只需"写一个字节进去 / 读一个字节出来"。
  • 挂在 APB 总线上:以 STM32 为例,USART1 挂 APB2,USART2/3 等挂 APB1,波特率时钟就来自对应总线时钟(fCK)。
  • 有自己的寄存器组:数据寄存器(TDR/RDR)、波特率寄存器(BRR)、控制寄存器(CR1/CR2/CR3)、状态/中断寄存器(ISR)。
  • 三种工作方式:轮询、中断、DMA(3.4 节展开)。
  • 引脚是复用关系:USART 外设的 TX/RX 信号要通过 GPIO 复用功能(AF) 引到芯片外部引脚上,引脚不配置 AF,外设是"接不到线"的。

理解这一点很关键:串口通信 = 片上 USART 硬件自动干活,CPU 只负责配置和搬运数据。


3.2 UART 和 USART

对比项 UART USART
全称 Universal Asynchronous Receiver/Transmitter UniversalSynchronous/Asynchronous Receiver/Transmitter
异步模式 支持 支持(就是 UART 模式)
同步模式 不支持 支持(多一根 SCLK 时钟线,主机给时钟)
扩展协议 部分型号支持 LIN、SmartCard、IrDA
日常用途 异步串口 99% 场景用它的异步模式,即"串口"

STM32 等芯片标注的都是 USART,因为它是 UART 的"超集";我们说的串口通信,实际用的是 USART 的异步模式。


3.3 4 方关系

一次串口通信涉及四个角色,数据必须依次穿过它们,这就是"4 方关系":

复制代码
 ① CPU 内核                ② USART 外设              ③ GPIO 引脚        ④ 外部设备
 ┌────────┐  读写寄存器  ┌──────────┐  内部连线   ┌────────┐  板级连线  ┌────────┐
 │ 程序   │ ───────────► │ TDR/移位 │ ──────────► │ TX(AF) │ ────────► │ 对方 RX │
 │ 内存   │              │ 寄存器   │             │ RX(AF) │ ◄──────── │ 对方 TX │
 │        │ ◄─────────── │ RDR/移位 │ ◄────────── │        │           │        │
 └────────┘   AHB/APB    └──────────┘   复用功能  └────────┘  TTL电平   └────────┘
角色 职责 配置要点
① CPU 内核 数据源头/终点,执行收发代码 通过总线读写 TDR/RDR
② USART 外设 并串转换、波特率生成、帧打包解包、过采样 开外设时钟、配 BRR/CR 寄存器、使能 TE/RE
③ GPIO 引脚 把外设信号引到芯片外部 开 GPIO 时钟、配复用功能 AF、对应引脚号
④ 外部设备 通信对端(USB-TTL 模块、另一 MCU、蓝牙/GPS 模块) 接线 TX↔RX、共地、电平匹配

发送数据流:

CPU → 总线 → TDR → 发送移位寄存器 → TX 引脚(AF)→ 外部设备 RX。

接收数据流:

外部设备 TX → RX 引脚(AF)→ 接收移位寄存器 → RDR → 总线 → CPU。

为什么要强调 4 方关系:

初学者常以为"串口就是两根线",实际上数据要穿过CPU → 外设 → 引脚 → 对端四层,任何一层没配好都不通------没开外设时钟、没配 AF、没使能 TE/RE、接线错误,现象都是"串口没反应",排查时要逐层定位。


3.4 MCU 和 USART 设备通信的宏观过程和问题

宏观发送过程:

CPU 写 TDR → 硬件自动按帧格式、波特率逐位移出 → 完成置标志。

宏观接收过程:

RX 引脚检测到起始位下降沿 → 16 倍过采样收齐一帧 → 数据进 RDR 并置 RXNE → CPU 必须及时读走。


由此产生几个核心问题,也是工程设计的出发点:

1.速度严重不匹配:CPU 是 ns 级,串口是 µs 级(115200 下一字节 86.8µs)。CPU 不能傻等,于是有三种处理方式:

方式 做法 优点 缺点 适用
轮询 while 死等 TXE/RXNE 标志 简单 阻塞、占满 CPU、易丢数据 数据量极小
中断 RXNE/TXE 触发中断,在 ISR 里搬运 实时、不阻塞主程序 高频中断有开销 常规收发
DMA 外设与内存间硬件直搬,CPU 不参与 几乎零 CPU 占用、最适合连续流 配置稍复杂 高速/大批量

**2.**数据会丢(ORE) :RDR 只有一字节缓冲,新字节到了旧字节还没读走 → 过载错误、数据被覆盖。解决:中断/DMA + 软件环形缓冲区(FIFO)。

3.不定长数据怎么收:UART 是字节流,没有"包"的概念。常用方案:DMA + IDLE 空闲中断(总线空闲即一包结束,用 DMA 剩余计数差值算包长)、帧头+长度字段、超时判断。

错误处理:FE(帧错误)、PE(校验错误)、NE(噪声)、ORE(过载),需要在中断里读状态、清标志、丢弃坏帧。

4.双端一致性:波特率/帧格式必须一致;电平要匹配(TTL↔RS-232/USB/RS-485 需转换芯片)。

5**. 可靠性要在协议层补****:UART 只保证"位"的传输,不保证内容正确,需自定帧头帧尾 + 长度 + CRC + 应答重传**


4. 比特率 vs 波特率

概念 全称 定义 单位
比特率 Bit Rate 单位时间内传输的****二进制比特总数 bit/s(bps)
波特率 Baud Rate 单位时间内传输的****码元(符号)总数 Baud

4.1.1 比特率(Bit Rate)

  • 定义:每秒传输的二进制比特(bit)数量,衡量的是信息传输速度
  • 单位:bps(bit per second,比特/秒),也写作 bit/s、b/s。
  • 公式:比特率 = 每秒传输的比特总数
  • 例子:1 秒传 115200 个0/1,比特率就是 115200 bps。
  • 关注点:它描述"有效信息传多快",与编码方式无关,只数实际比特。

4.1.2 波特率(Baud Rate)

  • 定义:每秒信号状态(符号 Symbol)变化的次数,衡量的是信号波形变化速度

  • 单位:Baud(波特)。

  • 符号:一个符号可以是一个电平、一个相位、一个载波状态。

  • 二者关系:

    比特率 = 波特率 × 每个符号携带的比特数
    = 波特率 × log₂(M),M = 符号状态数

  • 二进制 NRZ(普通串口):只有高/低两个状态,M=2,一个符号 = 1 比特,所以:

    115200 Baud = 115200 bps ← 串口场景数值相等

  • 多电平调制(说明二者不等的场景):

编码 状态数 每符号比特 10000 Baud 时的比特率
NRZ(串口) 2 1 10 kbps
QPSK 4 2 20 kbps
16QAM 16 4 40 kbps
  • 常见误区:
    • "波特率就是比特率"------只在 1 比特/符号时数值相等,概念不同。
    • "115200 波特 = 每秒 115200 字节"------错,8N1 下一字节占 10 位(见第 7 节)。
    • 在通信/射频领域:波特率决定占用带宽,比特率决定实际吞吐。

5. USART 速度与波特率

5.1 波特率由时钟分频产生

USART 没有独立振荡器,波特率来自外设总线时钟 fCK 分频:

复制代码
异步、16 倍过采样(OVER8=0):波特率 = fCK / (16 × USARTDIV)
异步、8  倍过采样(OVER8=1):波特率 = fCK / (8  × USARTDIV)
同步模式:                    波特率 = fCK / (2  × USARTDIV)

5.2 BRR 寄存器结构

复制代码
BRR:[15:4] = DIV_Mantissa(整数部分)
     [ 3:0] = DIV_Fraction(小数部分 × 16)

USARTDIV   = fCK / (16 × 目标波特率)
Mantissa   = USARTDIV 的整数部分
Fraction   = USARTDIV 小数部分 × 16(四舍五入)
BRR = (Mantissa << 4) | Fraction

5.3 算例

例 1:fCK = 72 MHz,目标 115200(精确)

复制代码
USARTDIV = 72e6/(16×115200) = 39.0625
Mantissa = 39,Fraction = 0.0625×16 = 1
BRR = (39<<4)|1 = 0x271
实际波特率 = 72e6/(16×39.0625) = 115200 ✅

例 2:fCK = 8 MHz,目标 9600(有量化误差)

复制代码
USARTDIV = 8e6/(16×9600) = 52.0833
Mantissa = 52,Fraction = 0.0833×16 ≈ 1.33 → 取 1
实际波特率 = 8e6/(16×52.0625) ≈ 9603.8
误差 ≈ +0.04% ✅

5.4 误差分析与常见速率

  • 分频小数位只有 4 位(8 倍过采样时 3 位),必然有量化误差。工程上要求收发两端总误差控制在 ±2%~3% 内;帧越长、连续字节越多,对误差越敏感(详见第 7 节)。
  • 8 倍过采样可在相同时钟下支持更高波特率,但采样次数少、抗噪能力略降。
波特率 8N1 单字节耗时 有效吞吐 场景
9600 ≈1.04 ms ≈960 B/s 老设备/长线
38400 ≈260 µs ≈3.8 KB/s 一般模块
115200 ≈86.8 µs ≈11.5 KB/s 调试黄金速率
460800 ≈21.7 µs ≈46 KB/s 高速
921600 ≈10.9 µs ≈92 KB/s 高速(需高精度时钟)

5.5 自动波特率检测(ABR)

部分 MCU 支持自动波特率:接收端根据主机发来的已知特征字节(如 0x7F、0x55)测量边沿间隔,自动算出波特率并写回 BRR,用于主机速率未知或可变的场景。


6. USART 帧格式

一帧的完整结构:

| 字段 | 长度 | 电平 | 作用 |
| 空闲态 | 任意长度 | 高电平 | 总线无数据时保持,代表线路空闲 |
| 起始位 | 固定 1 位 | 低电平 | 从高到低的跳变,通知接收方 "一帧数据开始" |
| 数据位 | 5/6/7/8/9 位 | 0/1 | 有效载荷,低位 (LSB) 在前,高位 (MSB) 在后;最常用 8 位(1 字节) |
| 校验位 | 0/1 位 | 0/1 | 可选,奇校验 / 偶校验,用于检测传输错误 |

停止位 0.5/1/1.5/2 位 高电平 表示一帧结束,给接收方准备时间;最常用 1 位

6.1.1 空闲状态(Idle State)

  • 定义:线上没有数据传输时,保持高电平(逻辑 1)。
  • 为什么是高而不是低:高电平作为"静止基准",起始位用低电平才能产生明确的下降沿;同时持续高电平可让接收端区分"总线空闲"和"一直被拉低(断线/异常)"。
  • IDLE 事件:当总线在收到数据后重新回到一帧以上的高电平,硬件置 IDLE 空闲标志。这是"DMA + IDLE 收不定长数据"的关键------一包数据发完、总线空闲,就触发中断,软件据此判定一包结束。
  • 空闲帧:一整帧时长的高电平,区别于后面的断开帧。

6.1.2 起始位(Start Bit)

  • 长度:固定 1 位,低电平。
  • 作用:
    1. 帧同步起点:从空闲高到起始低的下降沿,通知接收端"一帧开始了",接收端从这一刻开始按波特率计时。
    2. 对表:异步通信没有时钟,全靠这个边沿重新对齐,消除累积误差。
  • 防误触发:接收端在下降沿后还要连续多次采样确认确实为低(防止一个毛刺被误判成起始位),确认后才在后续位中心采样。
  • 起始位不携带数据,是纯开销。

6.1.3 数据位(Data Bits)

  • 长度可配 5~9 位,最常用 8 位(正好一个字节)。

  • 发送顺序:数据 LSB ( Least Significant Bit :最低有效位 ) 最先发送,然后是次低位,依此类推,最后发送 MSB ( Most Significant Bit :最⾼有效位 )。

  • 每位由接收端在位中心用 16 倍过采样 + 3 次多数表决还原。

  • 字长配置细节(STM32):

    • 无校验 + 8 数据位 → 字长 M 位设 8。
    • 带校验时,校验位占字长中的一位:要发 8 数据 + 1 校验,字长要设成 9(M=1),这是常见配置坑。
    • 9 数据位用于多机地址模式(第 9 位标记地址帧/数据帧)。
  • 数据位是帧里唯一携带有效信息的部分,其余都是开销。


6.1.4 校验位(Parity Bit)

  • 位置:紧跟数据位之后、停止位之前,1 位,可选。
  • 三种方式:
方式 规则 举例(数据 0x41 = 0100 0001,两个 1)
无校验 None 不发校验位 8N1
偶校验 Even 数据位+校验位中 1 的个数为偶数 已有 2 个 1(偶),校验位=0
奇校验 Odd 1 的个数为奇数 已有 2 个 1,校验位=1 凑成 3
  • 接收端重新计算并比对,不符则置 PE(Parity Error)。
  • 局限:
    • 只能检错,不能纠错(不知道哪一位错)。
    • 只能检出奇数个位翻转;偶数个位同时翻转会漏检。
    • 可靠传输仍需上层 CRC/校验和 + 重传。
  • 代价:多 1 位开销(约 10% 时间),所以多数场景用 8N1。

6.1.5 停止位(Stop Bits)

  • 电平:高电平(回到空闲态)。
  • 长度可配:0.5、1、1.5、2 位,最常用 1 位(8N1);2 位用于部分老式设备。
  • 作用:
    1. 标志一帧结束,给接收端整理、准备下一帧的时间。
    2. 保证下一帧起始位之前线上一定是高电平,从而下一帧起始位的下降沿一定存在。
  • 帧错误检测:接收端预期停止位时刻采样,如果采到的是低电平(没有正常高电平停止位),判定 FE(Framing Error)------最常见原因是波特率不匹配或干扰。
  • 停止位也是开销:2 位停止比 1 位慢约 10%。

7. USART 帧格式与波特率(综合)

7.1 核心公式

复制代码
单帧时长 = (1 起始位 + 数据位数 + 校验位 + 停止位数) / 波特率
有效数据率 = 波特率 × 数据位数 / 每帧总位数

7.2 算例对照(115200)

配置 帧位数 单字节耗时 有效数据率
8N1 10 86.8 µs 92.16 kbps ≈ 11.5 KB/s
8E1/8O1 11 95.5 µs 83.8 kbps ≈ 10.2 KB/s
8N2 11 95.5 µs 83.8 kbps ≈ 10.2 KB/s

115200 波特 ≠ 115200 字节/秒:

8N1 每字节实际占 10 位,真实上限 115200/10 ≈ 11520****B/s。


7.3 波特率容差(为什么高速更易乱码)

收发时钟偏差 δ 沿整帧累积,第 N 位采样点偏移约 N×δ 个位周期,超过约半个位周期就采错:

复制代码
单帧理论容忍 ≈ 0.5 / 帧位数
8N1(10 位)≈ 5%;考虑过采样表决和噪声,工程上取 ±2%~3% 更稳

帧越长、连续字节越多,误差累积越大;

低速(9600)比高速(115200+)对晶振误差宽容。

内部 RC 振荡器温漂大,高速串口建议用外部晶振。


7.4 工程选型

  • 速率:稳定优先 9600~38400;均衡 115200;高速 460800+(短线、低干扰、高精度时钟)。
  • 帧格式:默认 8N1;需检错用 8E1/8O1;多机用 9 位地址模式或 RS-485。
  • 收发方式:小数据轮询,常规中断 + 环形缓冲,连续大数据 DMA + IDLE。
  • 可靠性:协议层做帧头帧尾 + 长度 + CRC + 应答重传。

8. 常见错误与排查

现象 可能原因
完全乱码,全是不可打印字符 ①波特率不匹配;②数据位 / 校验位 / 停止位不一致;③TX/RX 接反
个别字符错误、丢包 ①波特率误差过大;②没有共地;③电磁干扰;④接收溢出 ORE
只能发不能收 ①RE 接收使能没开;②RX 引脚配置错误;③波特率误差大
只能收不能发 ①TE 发送使能没开;②TX 引脚配置错误;③TXE 没等待
前几个字节正常,后面乱码 接收溢出错误 ORE,CPU 读太慢,新数据覆盖旧数据
偶发错误,干扰时出错 ①线路太长;②没有屏蔽;③电平不匹配

9. 面试题库(含解析)

A. 基础概念

1. UART 全称和作用?

通用异步收发器。把并行数据转串行按位发送、把串行数据拼回并行,实现两设备异步串行通信。


2. UART 和 USART 的区别?

USART 是同步/异步收发器,比 UART多同步模式(SCLK 时钟线)及LIN/SmartCard/IrDA 等扩展;日常串口用的是 USART 的异步模式。


3. 为什么叫异步?没有时钟线怎么同步?

双方不共享时钟,靠约定波特率 + 起始位下降沿对表,接收端用 16 倍过采样在每位中心采样还原数据。


4. 串口最少几根线?为什么共地?

TX、RX、GND 三根(单向可两根)。GND 是电平参考,不共地则双方高低电平基准不一致,会乱码甚至损坏接口。


5. 串口属于 MCU 的什么?为什么说它是片上外设?

是集成在芯片内部的独立硬件外设(IP 核),挂在 APB 总线上,配置好后移位、采样、帧打包全部硬件自动完成,CPU 只需读写数据寄存器,不必逐位参与。


B. 结构与过程

6. 串口通信的"4 方关系"是什么?

CPU 内核(数据源/终点)、USART 外设(并串转换+波特率+帧处理)、GPIO 引脚(AF 复用把信号引出)、外部设备(对端)。数据依次穿过四层,任一层配置缺失都不通。


7. 数据从程序到对方设备经过哪些环节?

CPU 写 TDR → 发送移位寄存器逐位移出 → TX 引脚(AF)→ 板级连线 → 对方 RX;接收反向。


8. 轮询、中断、DMA 三种收发方式怎么选?

数据量极小用轮询(简单但阻塞);

常规突发用中断(实时但高频中断有开销);

高速连续流用 DMA(硬件直搬、CPU 零占用,常配 IDLE 中断收不定长)。


9. 什么是 ORE?怎么避免丢数据?

过载错误:RDR 里旧字节未读走、新字节又到,旧数据被覆盖。

避免方法:及时开 RXNE 中断/DMA 取走数据,并用环形缓冲区缓存。


10. 怎么用串口接收不定长数据包?

DMA 把字节直搬到内存 + IDLE 空闲中断判定一包结束,用 DMA 剩余计数(CNDTR 前后差值)算出本次实际字节数;也可用帧头+长度字段或超时判断。


C. 帧格式与原理

11. 8N1 一帧多少位?由什么组成?

10 位 = 1 起始位 + 8 数据位 + 无校验 + 1 停止位。


12. 空闲状态为什么是高电平?

作为静止基准,使起始位能产生明确下降沿;同时区分"空闲"与"线被持续拉低"的断线/异常状态


13. 起始位为什么是低电平、几位?

固定 1 位低电平,用高→低的下降沿标记帧起点并给接收端对表;

接收端还会连续采样确认,防毛刺误触发


14. 数据位先发高位还是低位?可配几位?

低位在前**(LSB first);可配 5~9 位,常用 8 位。**


15. 带校验时 STM32 字长怎么配?为什么?

校验位占用字长一位,8 数据 + 1 校验要把字长设为 9 位(M=1),否则会出现数据错位。


16. 奇偶校验怎么算?能纠错吗?

偶校验保证数据+校验中 1 的个数为偶,奇校验为奇。

只能检错不能纠错,且偶数位同时翻转会漏检;可靠传输靠上层 CRC。


17. 停止位几位、什么电平、有什么用?

高电平,可配 0.5/1/1.5/2 位,常用 1 位。

标志帧结束、给接收端准备时间,并保证下一帧起始位下降沿存在。


18. FE 帧错误是什么原因?

预期停止位时刻采到低电平,常见于波特率不匹配或线路干扰。


D. 波特率与计算

19. 波特率和比特率的区别?何时相等?

波特率是每秒符号变化次数(Baud),比特率是每秒比特数(bps),关系为 比特率=波特率×log₂(状态数)。二进制串口 1 符号=1 比特,数值相等;QPSK/QAM 等多电平调制下不等。


20. BRR 寄存器怎么算?

举例。 USARTDIV=fCK/(16×波特率),BRR=(整数部分<<4)|(小数部分×16)。72MHz 配 115200:USARTDIV=39.0625,BRR=0x271,实际恰好 115200。


21. 115200 波特每秒最多传多少字节?

8N1 每字节 10 位:115200/10≈11520 B/s≈11.5 KB/s,不是 115200 字节。


22. 波特率误差多少能接受?为什么高速更容易乱码?

工程上两端总误差控制在 ±2%~3%。

误差沿帧逐位累积,帧越长、速率越高,采样点越容易偏移到位边界,所以高速更敏感。


23. 什么是 16 倍过采样?作用?

每位用 16 个采样时钟,在位中心采 3 次多数表决,抗毛刺抖动、容忍波特率误差;

8 倍过采样可支持更高速率但抗噪略差。


E. 综合与工程

24. TXE 和 TC 的区别?RS-485 为什么用 TC 切方向?

TXE 表示 TDR 已空(可写下一字节);TC 表示整帧(含停止位)已完全移出。

RS-485 半双工,必须等数据真正发完才能把 DE 切回接收,所以用 TC。


25. 3.3V MCU 和 5V MCU 串口能直连吗?

3.3V 发 5V 收一般可识别但余量小;

5V 发 3.3V 收可能损坏引脚,应加电平转换芯片、开漏上拉或分压。


26. 为什么工业现场用 RS-485 而不是 TTL 串口?

TTL 单端电平易受共模干扰、传不远;

RS-485 差分传输抗干扰强、可传 1200m+、支持多节点总线。


27. 串口乱码排查顺序?

① 波特率与帧格式两端一致;

② TX/RX 是否接反、是否共地;

③ 电平是否匹配;

④ 外设/GPIO 时钟和 AF 复用是否配置;

⑤ 晶振精度与干扰;

⑥ 错误标志(FE/PE/ORE)。


28. UART 本身可靠吗?怎么做可靠传输?

UART 只保证位传输,不保证内容正确。

协议层需加帧头帧尾、长度、CRC/校验和、序号、应答与超时重传。


相关推荐
aningx1 小时前
使用自定义bash脚本预防oom卡死
linux
ONLYOFFICE2 小时前
ONLYOFFICE成为Linux操作系统 – Winux的预装办公套件
linux·运维·服务器
mounter6252 小时前
从内核安全到可编程基础设施:Meta 的 eBPF 实践与形式化验证探索
linux·ebpf·linux kernel·kernel
新时代牛马2 小时前
嵌入式 Linux WiFi 框架完整篇:从cfg80211、mac80211 到wpa_supplicant
linux·运维·服务器
吴声子夜歌2 小时前
Linux命令——打印
linux·运维·服务器
企鹅的蚂蚁2 小时前
Linux 开发板串口调试:picocom 从识别到退出的完整用法
linux·运维·服务器
分享资料2 小时前
用小电容消除高频信号的原因
嵌入式硬件·硬件工程
bksczm2 小时前
从 “什么是 MySQL“ 到库与表的完整操作(MySQL基础篇)
linux·数据库·mysql
沐欣工作室_lvyiyi2 小时前
基于STM32的人脸识别门禁系统的设计与实现(论文+源码)
stm32·单片机·嵌入式硬件