串行通信基础:串行/并行、同步/异步与全双工原理
串行通信是嵌入式系统中最基础的数据传输方式,其核心在于理解物理层信号组织与时钟同步机制。从概念上讲,串行与并行的本质差异在于数据位的时间-空间映射关系,而非单纯的速度比较;同步通信依赖共享时钟线实现高精度采样,而异步通信则通过起始位和停止位完成自同步。技术价值体现在抗干扰强、布线简洁、成本低,适用于工业RS-485、传感器UART、I²C总线等典型场景。在STM32等主流MCU平台中,正确配置波特
1. 数据通信的基础概念体系
在嵌入式系统开发中,串行通信是连接微控制器与外部设备最基础、最普遍的物理层接口。然而,许多工程师在实际项目中遇到通信异常、波特率偏差、抗干扰能力差等问题时,往往将原因归结于硬件焊接不良或电平不匹配,却忽视了对通信底层原理的系统性理解。这种“知其然不知其所以然”的状态,直接导致调试周期延长、方案选型失误,甚至在多设备级联系统中引发难以复现的偶发故障。本节将从工程实践出发,剥离教学语境中的口语化表达,构建一套完整、准确、可直接指导硬件设计与软件配置的数据通信基础概念体系。
1.1 串行与并行通信:物理层拓扑的本质差异
通信方式的分类首先源于数据在物理介质上的组织形态。 串行通信(Serial Communication) 与 并行通信(Parallel Communication) 的根本区别,在于数据位(bit)在传输线路上的时间-空间映射关系,而非简单的“快慢”之分。
-
串行通信 :所有数据位按时间顺序,在单一信号线上逐位(bit-by-bit)传输。例如,传输一个字节(8 bit)时,需经历8个连续的时钟周期,每个周期仅传送1 bit。其典型物理实现仅需1根数据线(单向)或2根数据线(双向:TX/RX),外加公共地线(GND)。STM32的USART外设即为此类通信的硬件载体,其GPIO引脚(如USART1_TX对应GPIOA_Pin9,USART1_RX对应GPIOA_Pin10)被配置为复用推挽输出/浮空输入模式,正是为了适配这种单线/双线拓扑。
-
并行通信 :所有数据位在同一时刻,通过多条独立的信号线并行(bit-at-a-time)传输。传输一个字节时,8条数据线同时有效,理论上单次操作即可完成。典型的并行总线如早期PC的LPT打印口(8位数据线+数条控制线)或SRAM存储器接口(16/32位数据总线)。
二者的核心差异并非速度本身,而是 系统级权衡(Trade-off) :
| 特性 | 串行通信 | 并行通信 |
|---|---|---|
| 物理连线数量 | 极少(1–2根数据线) | 多(8/16/32根数据线) |
| PCB布线复杂度 | 低,易于长距离走线,阻抗控制简单 | 高,多线需严格等长以避免 skew(偏斜),高频下布线困难 |
| 电磁兼容性(EMC) | 强 :单线/双线辐射耦合小,共模噪声抑制能力强 | 弱 :多线形成大环路天线,易辐射与接收干扰,高频下尤为显著 |
| 最大可靠通信距离 | 长 (RS-485可达1200米) | 短 (TTL电平并行总线通常<30 cm) |
| MCU I/O资源占用 | 少 (如USART仅占2个GPIO) | 多 (8位并行需8个GPIO,外加地址/控制线) |
| 系统成本 | 低 (线缆、连接器、PCB面积成本均小) | 高 (多芯电缆、高密度连接器、多层PCB成本上升) |
在现代嵌入式设计中,并行接口已大幅退潮。其主因并非速度劣势——高速SerDes(Serializer/Deserializer)技术已使串行链路(如PCIe, USB, SATA)带宽远超传统并行总线——而在于上述系统级约束。工程师选择串行方案,首要考量的是 可靠性、可制造性与成本 ,而非单纯追求理论带宽。例如,在工业现场部署STM32F4系列控制器与多个传感器通信时,即便传感器支持SPI(并行时序),工程师仍倾向选用RS-485(串行)总线,正是因为其千米级通信距离与卓越的抗共模干扰能力,这是并行方案无法企及的。
1.2 单工、半双工与全双工:信道方向性的工程定义
数据流向的控制逻辑,决定了通信系统的交互模型与协议栈设计。这一分类依据是 同一时刻数据能否在两个方向上同时流动 ,其本质是对物理信道(Channel)资源的抽象。
-
单工(Simplex) :数据仅能沿 单一固定方向 传输。发送端(Transmitter)与接收端(Receiver)角色永久固化,无切换可能。典型应用如广播发射塔(仅发送)、LED数码管驱动(MCU仅向显示模块写入数据)。在STM32系统中,若将USART配置为仅使能TX功能(禁用RX中断与DMA),并断开RX引脚,即构成单工链路。其优势在于硬件极简、功耗最低,但牺牲了任何反馈与握手能力。
-
半双工(Half-Duplex) :数据可在两个方向上传输,但 同一时刻仅允许一个方向有效 。这要求收发双方共享同一物理信道,并通过严格的时序协议(如主从轮询、令牌传递)或硬件信号(如RS-485的DE/RE控制引脚)协调信道占用权。例如,STM32通过GPIO控制MAX485芯片的DE(Driver Enable)引脚:当DE=1时,MCU驱动总线发送;当DE=0时,MCU释放总线并进入接收模式。此模式节省1根线缆,但引入了额外的控制逻辑与潜在的冲突风险——若两端同时尝试发送,将导致总线争用与数据损坏。
-
全双工(Full-Duplex) :数据可 在两个方向上同时、独立 地传输。其物理基础是存在两条分离的信道:一条专用于发送(TX),一条专用于接收(RX)。UART/USART正是此类接口的典范。在STM32中,USARTx_TX与USARTx_RX引脚分别连接至不同线路,硬件内部的发送移位寄存器与接收移位寄存器完全异步工作。这意味着MCU可在发送一个字节的同时,无缝接收来自外设的另一个字节,无需任何软件干预或等待。这种并行性是实现高效流控(如XON/XOFF)、实时响应(如Modbus RTU从机即时应答)的关键前提。
工程师在选型时必须明确: 双线制(TX+RX)不必然等于全双工 。例如,I²C总线虽有SCL(时钟)与SDA(数据)两根线,但SDA为开漏结构,所有器件共享同一数据线,因此属于半双工。真正的全双工判定标准是:是否存在 物理隔离、方向固定的独立数据通路 。在STM32项目中,若需求涉及高吞吐量、低延迟的双向数据交换(如音频流传输、实时遥测),必须优先选用全双工USART;若仅为低成本传感器轮询,则半双工RS-485更为经济。
1.3 同步与异步通信:时钟同步机制的架构分野
数据采样的准确性,取决于接收方能否在精确的时刻对信号电平进行判决。这依赖于发送方与接收方之间的时间基准(时钟)如何建立与维持。由此衍生出同步(Synchronous)与异步(Asynchronous)两大范式。
-
同步通信(Synchronous) :发送方与接收方 共享同一时钟源 ,该时钟信号(SCLK)作为数据采样的绝对基准,通过专用线路(如SPI的SCK线、I²C的SCL线)显式传输。数据位严格对齐于时钟边沿(上升沿或下降沿)。其帧结构极其简洁:通常仅包含有效数据位,无额外开销。例如,SPI通信中,主机输出SCK脉冲,从机在每个SCK边沿同步采样MISO线上的数据。优势在于: 高吞吐量、无起始/停止开销、时钟恢复简单 。缺点是: 增加一根时钟线,系统布线更复杂,且长距离传输时钟抖动与偏斜会严重影响采样精度 。在STM32中,SPI外设的时钟由APB总线分频产生,其相位与极性(CPOL/CPHA)需与从机严格匹配,否则将导致采样点错位。
-
异步通信(Asynchronous) :发送方与接收方 各自拥有独立的时钟源 ,无专用时钟线。为解决采样时机问题,其帧结构被强制嵌入 自同步信息 :每个数据字节被包裹在起始位(Start Bit,固定为逻辑0)、数据位(5–9 bit)、可选奇偶校验位(Parity Bit)和停止位(Stop Bit,固定为逻辑1,长度可为1/1.5/2 bit)之中。接收方依靠检测起始位的下降沿触发内部定时器,在数据位中心位置进行采样。其核心挑战是: 双方时钟频率必须高度一致(通常容差≤±2.5%) ,否则采样点将随时间漂移,最终导致误码。UART/USART即为此类。在STM32 HAL库中,
HAL_UART_Init()函数配置的huart->Init.BaudRate参数,本质是计算APB总线时钟经USARTDIV分频后,生成符合目标波特率的内部位时钟。若系统时钟配置错误(如未正确设置RCC时钟树),即使代码逻辑完美,通信也必然失败。
一个关键工程经验是: “无时钟线”是异步通信的充分但非必要条件 。某些协议(如USB)虽无独立SCLK线,但通过编码(如NRZI+位填充)在数据流中隐含时钟信息,属“自同步”范畴,与UART的“帧同步”有本质区别。对于初学者,最可靠的判据是: 查看物理接口定义 。若芯片手册明确标注“SCLK”或“CLK”引脚,则为同步;若仅有“TXD”、“RXD”、“GND”,则必为异步。
1.4 波特率与比特率:调制效率的量化标尺
在数字通信中,“速度”一词常引发混淆。必须严格区分两个物理量:
-
比特率(Bit Rate) :单位时间内传输的 原始二进制位(bit)数量 ,单位为bps(bits per second)。它直接反映信息流的原始带宽。例如,传输ASCII字符‘A’(0x41 = 0b01000001)需8 bit,若每秒传输100个‘A’,则比特率为800 bps。
-
波特率(Baud Rate) :单位时间内传输的 符号(Symbol)数量 ,单位为Baud。一个符号是物理信道上可区分的一个状态,它可能携带1 bit或多bit信息,取决于调制方式。
二者关系由香农信息论决定:
比特率 = 波特率 × log₂(M)
其中, M 是调制阶数(Modulation Order),即一个符号所能表示的不同状态数。
-
二元调制(M=2) :最常见情形。如UART使用高低电平代表0/1,每个符号仅含1 bit信息。此时, 波特率数值上等于比特率 (如9600 Baud = 9600 bps)。STM32的USART默认工作在此模式,
huart->Init.BaudRate = 115200即配置为每秒发送115200个符号,每个符号承载1 bit。 -
多元调制(M>2) :为提升频谱效率,可在同一符号周期内编码更多比特。例如:
- 4-PAM(Pulse Amplitude Modulation) :用4个不同电压电平(如0V, 3V, 6V, 9V)代表00, 01, 10, 11,M=4,log₂(4)=2,故1 Baud = 2 bps。
- QPSK(Quadrature Phase Shift Keying) :用4种相位(0°, 90°, 180°, 270°)编码2 bit,同样实现1 Baud = 2 bps。
在嵌入式领域,除特定无线模块(如ESP32的Wi-Fi/BLE PHY层)采用多元调制外,绝大多数有线接口(UART, SPI, I²C)均采用二元调制。因此,工程师可安全地将“波特率”等同于“通信速率”。但必须牢记: 波特率是硬件配置参数,比特率是信息论度量 。当配置STM32 USART时, BaudRate 字段设置的是物理层符号速率,而非应用层数据吞吐率。实际有效数据速率还需扣除帧开销(起始位、停止位、校验位)。例如,配置8N1(8数据位、无校验、1停止位)格式,传输1字节需10符号周期(1起始+8数据+1停止),故在115200 Baud下,最大理论字节吞吐率为11520 Baud ÷ 10 = 11520 bytes/s。若启用校验位(8E1),则升至115200 ÷ 11 ≈ 10472 bytes/s。这一计算是评估通信是否满足实时性要求(如传感器数据上报周期)的基石。
1.5 常见串行通信接口:物理层与协议层的映射
嵌入式系统中,多种串行接口并存,其差异体现在物理层电气特性、数据链路层协议及应用层规范三个层面。下表聚焦物理层与链路层核心特征:
| 接口 | 信号线 | 同步/异步 | 双工模式 | 典型电气标准 | STM32外设 | 关键工程考量 |
|---|---|---|---|---|---|---|
| UART/USART | TX, RX, GND (3线) | 异步 | 全双工 | TTL/CMOS, RS-232, RS-485 | USART1–8 | 最通用;需注意电平匹配(TTL直连、RS-232需MAX232、RS-485需MAX485);波特率精度依赖系统时钟稳定性 |
| I²C | SDA, SCL, GND (2线+上拉) | 同步 | 半双工 | 开漏输出,需上拉电阻 | I2C1–3 | 多主多从;地址寻址;SCL/SDA需严格等长;上拉电阻值影响上升时间与功耗(高速模式需更小阻值) |
| SPI | SCK, MOSI, MISO, NSS (4线+) | 同步 | 全双工 | 推挽输出,主从模式 | SPI1–3 | 高速;全双工;NSS线决定从机选择;时钟极性(CPOL)与相位(CPHA)必须主从一致;MOSI/MISO方向由NSS激活状态决定 |
| USB | D+, D-, VBUS, GND (4线) | 同步(自同步) | 全双工 | 差分信号,需终端匹配 | USB OTG_FS/HS | 协议复杂;需专用PHY;STM32F4/F7/H7内置PHY;固件需实现USB Device Stack(如CDC ACM虚拟串口) |
工程师在项目初期必须完成接口选型决策,其依据绝非“哪个更熟”,而应是:
1. 拓扑需求 :点对点(UART)?总线式多节点(I²C/RS-485)?
2. 速度需求 :低速传感器(I²C 100kHz)?高速Flash(SPI 50MHz)?
3. 布线约束 :空间受限(I²C 2线)?长距离工业环境(RS-485差分)?
4. 协议栈负担 :能否承担USB协议栈内存开销?是否需要硬件自动处理ACK/NACK(I²C)?
例如,在STM32H7项目中为OLED显示屏通信选型:若屏幕仅一个且距离<10cm,SPI(高速、全双工、无寻址开销)是首选;若需挂载多个传感器(温湿度、气压、陀螺仪)并共用总线,则I²C的地址寻址与2线优势凸显,尽管其速度低于SPI。
2. 串行通信的工程落地:从概念到STM32 HAL配置
理解上述概念后,必须将其映射到具体硬件平台。以STM32F103C8T6(主流入门型号)为例,其USART1外设位于APB2总线,最高支持4.5 Mbps波特率。HAL库封装了底层寄存器操作,但工程师仍需透彻理解配置项背后的硬件逻辑。
2.1 时钟树与USART时钟源
USART的波特率发生器(BRR)依赖精确的输入时钟。在STM32F1系列中,USART1挂载于APB2总线,其时钟源为HCLK(AHB时钟)经APB2预分频器(PCLK2)提供。假设系统主频为72 MHz(HCLK),APB2预分频器为1,则PCLK2 = 72 MHz。BRR寄存器计算公式为: DIV = (PCLK / (16 × BaudRate))
其中整数部分为DIV_Mantissa,小数部分为DIV_Fraction(4位)。例如,配置115200 Baud: DIV = 72000000 / (16 × 115200) ≈ 39.0625 → Mantissa=39 (0x27), Fraction=1 (0x1) → BRR=0x271。
若工程师错误地将APB2预分频器设为2(PCLK2=36 MHz),则实际波特率将偏离50%,导致通信完全失效。因此,在 SystemClock_Config() 中确认RCC配置是调试UART的第一步。
2.2 GPIO复用功能配置
USART的TX/RX引脚需从GPIO通用功能切换至复用功能。以USART1为例:
- TX引脚:GPIOA_Pin9 → 配置为 GPIO_MODE_AF_PP (复用推挽输出), GPIO_PULLUP (内部上拉,增强抗干扰), GPIO_SPEED_FREQ_HIGH (高速)。
- RX引脚:GPIOA_Pin10 → 配置为 GPIO_MODE_AF_INPUT (复用输入), GPIO_PULLUP (确保空闲态为高电平)。
此处 GPIO_PULLUP 至关重要。UART空闲态为逻辑1(高电平),若RX引脚悬空,易受干扰翻转,导致误触发起始位。HAL库中 MX_GPIO_Init() 函数内 HAL_GPIO_Init() 调用即完成此配置。
2.3 中断与DMA的协同策略
裸机轮询(Polling)虽简单,但浪费CPU资源。HAL库推荐中断(IT)或DMA模式:
- 中断模式 :配置 HAL_UART_Receive_IT() ,接收完成触发 HAL_UART_RxCpltCallback() 回调。适用于低频、不定长数据(如AT指令)。
- DMA模式 :配置 HAL_UART_Receive_DMA() ,数据直接搬移至内存缓冲区,CPU仅在DMA传输完成中断(TCIF)中处理。适用于高速、定长数据流(如ADC采样结果串口上传)。
关键点: 中断优先级必须高于其他非实时任务 。在 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0) 中设为最高(抢占优先级0),避免高优先级任务阻塞UART中断,导致接收缓冲区溢出(ORE标志置位)。
2.4 实际调试中的典型陷阱
- 波特率误差 :使用示波器测量TX引脚,观察起始位宽度。若理论值为1/115200≈8.68μs,实测为9.2μs,则误差约6%,超出UART容忍范围。根源常为RCC配置错误或晶振负载电容不匹配。
- 电平不匹配 :STM32 GPIO为3.3V TTL电平,直连RS-232设备(±12V)会损毁芯片。必须使用MAX3232等电平转换芯片。
- 接地回路干扰 :多设备共用GND时,大电流路径引入噪声。解决方案是采用光耦隔离或RS-485差分总线。
我在一个电力监控项目中曾遭遇间歇性通信丢包。排查数日,最终发现是RS-485收发器(SP3485)的DE引脚驱动不足,导致总线切换延时过长,与相邻设备发送窗口重叠。更换为驱动能力更强的MAX485并优化DE控制时序后,问题彻底解决。这印证了一个朴素真理:再完美的软件协议,也无法弥补物理层设计的缺陷。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)