uart(串口)

← 返回 MOC | ← 主页


简介

串口(UART),全称 Universal Asynchronous Receiver/Transmitter ,中文叫“ 通用异步收发器

注意,它 不是像 SPI 或 I2C 那样的通信协议,而是一块真实存在的电路.

工作:

  • 把 MCU 内部的并行数据转成串行形式发出去;
  • 或者把接收到的串行数据还原成并行数据送进系统。

TX对RX,RX对TX

17749222316001起始,5~9数据位,可选1奇偶校验,1 ~2停止位,这些串口助手都有

UART引脚-1774922523844USB转TTL,要下载驱动-通过串口助手(电脑上就有基础版本的,底下搜串口助手就好,常见好用的XCOM,VOFA)

也可以用逻辑分析仪之间看波形并且翻译,更可以示波器

通过RS232,RS485,TTL三种电平发送


知识要点

UART是异步⭐的,就是没有时钟线,一个TX,一个RX,一个GND

硬件流控(RTS/CTS) :接收缓冲区快满时通过CTS让对方暂停发送,防止数据丢失。这两个算可选

协议线数速率特点
UART2线(TX/RX)几百Kbps异步、点对点、全双工、简单调试串口、蓝牙/GPS模组
I2C2线(SDA/SCL)100K/400K/3.4Mbps同步、半双工、多从机、带寻址传感器、EEPROM、RTC
SPI4线几十Mbps同步、全双工、速度快、无寻址Flash、LCD、ADC ,屏幕等高速外设
CAN2线(差分)1Mbps多主多从、差分抗干扰、带仲裁、汽车工业常用汽车和工业总线

选型原则:低速简单用 UART,多设备低速用 I2C,高速短距离用 SPI,长距离抗干扰用 CAN。

波特率自适应 方法:

  • 发送方先发特定字符(如 0x7F),接收方测量脉冲宽度自动计算波特率
  • STM32支持硬件自动波特率检测:利用起始位下降沿到特定边沿的时间推算

波特率计算:

波特率 = 时钟频率 / (分频系数 × 过采样倍数)

以STM32为例:

  • USART挂在APB总线上(假设APB时钟=84MHz)
  • 过采样16倍:BRR = APB_CLK / (16 × BaudRate)
  • 如115200波特率:BRR = 84000000 / (16 × 115200) = 45.57
  • 取整为45,实际波特率 = 84000000 / (16×45) = 116667
  • 误差 = (116667-115200)/115200 ≈ 1.27%(在±3%以内,可用)

关键:误差不超过±3%,否则会出现乱码。高波特率时误差更容易超标。

Linux中UART的子系统,主要做什么?:

Linux UART 子系统 在 TTY 框架下工作:

层次结构:用户空间TTY 核心层Line DisciplineUART 驱动

主要工作:

  • 实现 uart_ops 回调函数:startupshutdownset_termios(配置波特率等)、start_tx(启动发送)
  • 注册 uart_port 到 serial core
  • 处理收发中断,数据通过 TTY 缓冲区传递给上层

优化手段:

  • 使用 DMA 做大块数据传输,减少中断次数
  • 接收用 DMA + 空闲中断 ,检测到总线空闲时触发 DMA 完成

用户空间通过 /dev/ttyS0/dev/ttyAMA0 访问串口。

UART问题排查:

误码率是错误比特数占总比特数的比例。

软件排查 :确认双方波特率完全一致(包括数据位、停止位、校验位)、检查时钟精度(误差>2%可能出错)、检查缓冲区溢出。

硬件排查 :用示波器看波形、检查走线长度和干扰、确认电平匹配(3.3V和5V需转换)、检查共地。

保证数据传输准确性的手段:

  1. 校验位(Parity) :帧中加入奇校验或偶校验位,接收方检测单 bit 错误。但只能检测不能纠正,且只能检测奇数个 bit 翻转
  2. 波特率一致 :双方波特率误差控制在 ±3% 以内,否则采样偏移导致数据错
  3. CRC 校验 :上层协议对整包数据做 CRC16/CRC32 校验,检错能力远强于 parity
  4. 帧头+帧长+校验和 :设计完善的通信协议包含帧头识别、数据长度、校验和字段
  5. ACK/重传机制 :接收方收到数据后回 ACK,发送方超时未收到 ACK 则重发
  6. 硬件层面 :注意信号完整性,避免长线传输可以加 RS-485/RS-422 差分收发器

使用的3种电平的区别:

RS485,RS232,TTL


UART接收程序

UART发送程序