1. 串口通信基础:从硬件到协议栈
作为一名在嵌入式领域摸爬滚打多年的工程师,我至今记得第一次调试串口通信时的场景——那是一个基于STM32的温湿度监测项目,当时因为波特率设置错误,导致接收到的全是乱码。这种看似简单却暗藏玄机的通信方式,恰恰是嵌入式开发的基石。今天,我就结合自己踩过的坑,系统梳理串口通信的完整知识体系。
1.1 UART硬件接口详解
任何串口通信都始于物理连接。标准的UART接口包含以下关键引脚:
- TXD (Transmit Data):数据发送线
- RXD (Receive Data):数据接收线
- GND :共地参考(常被忽视但至关重要)
注意:实际项目中,我曾遇到因忘记连接GND导致通信不稳定的案例。即使TXD/RXD接对,缺少共地参考也会使电平判断失准。
现代MCU通常提供多个UART外设,以STM32F103为例:
c复制// 查看芯片手册可知
USART1: PA9(TX), PA10(RX) // 默认复用功能
USART2: PA2(TX), PA3(RX)
USART3: PB10(TX), PB11(RX)
1.2 波特率生成原理
波特率(Baud Rate)的准确性直接影响通信成败。其计算公式为:
code复制波特率 = 时钟频率 / (16 × USARTDIV)
其中USARTDIV是写入波特率寄存器的值。以72MHz时钟、9600波特率为例:
code复制USARTDIV = 72000000 / (16 × 9600) = 468.75
整数部分468写入DIV_Mantissa,小数部分0.75×16=12写入DIV_Fraction。
经验:实际配置时建议使用STM32CubeMX自动计算,避免手动计算时的舍入误差。我曾因将468.75四舍五入为469导致通信异常。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据帧格式深度解析
2.1 标准UART帧结构
一个完整的UART数据帧包含以下部分(以8N1格式为例):
| 组成部分 | 位数 | 说明 |
|---|---|---|
| 起始位 | 1 | 逻辑低电平,标志帧开始 |
| 数据位 | 8 | 实际传输的数据,LSB优先 |
| 校验位 | 0 |
