一、UART基础与硬件接口

大家好,我是你们的嵌入式Linux驱动讲师。今天咱们来聊聊串口——这个看似简单、实则门道不少的外设接口。

说实话,我做了十几年嵌入式开发,串口是我打交道最多的接口之一。从最早的单片机调试,到后来做Linux驱动,串口始终是那个「最靠谱」的调试工具。但你知道吗?很多新手甚至老手,都在串口上栽过跟头。

核心观点:UART看似简单,但RS232/RS485的电气差异、电平转换、线序定义,任何一个环节出错,都会导致通信失败。我见过太多人花了一整天排查「驱动问题」,最后发现是杜邦线插反了。

1.1 UART协议原理

UART,全称Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,就是一种串行通信协议。

为什么叫「异步」?因为没有独立的时钟线。发送方和接收方各自用自己的时钟,靠约定好的波特率来同步。你想想看,两个人约好每分钟说60个字,那就不用中间有人打拍子了,对吧?

UART的数据帧结构是这样的:

起始位(1bit) + 数据位(5~8bit) + 校验位(可选) + 停止位(1/1.5/2bit)

举个例子,我们最常用的配置是8N1:8位数据、无校验、1位停止位。一帧总共10个bit。

传输过程:

  • 空闲时,TX线保持高电平
  • 要发送数据了,先把TX拉低1个bit时间——这就是起始位
  • 然后依次发送数据位,从LSB(最低位)开始
  • 如果有校验位,接着发
  • 最后拉高电平,持续1个bit时间——停止位

我的经验:调试时我习惯先用逻辑分析仪抓波形。看一眼起始位和停止位对不对,基本就能判断硬件连接有没有问题。比对着代码猜快多了。

1.2 RS232标准

RS232是早期PC串口的标准。它定义了电气特性、信号功能和机械接口。

电气特性:

  • 逻辑1(Mark):-3V ~ -15V
  • 逻辑0(Space):+3V ~ +15V
  • 换句话说,RS232用的是负逻辑,电压范围还很大

我记得第一次用RS232时,拿万用表量TX引脚,发现是负电压,吓了一跳。后来才知道,这就是RS232的正常状态。

RS232的缺点也很明显:

  • 传输距离短,一般不超过15米
  • 抗干扰能力一般
  • 只能点对点通信

1.3 RS485标准

RS485是工业现场最常用的串行通信标准。它解决了RS232的很多痛点。

RS485的特点:

  • 差分信号传输,抗干扰能力强
  • 传输距离可达1200米
  • 支持多点通信,一条总线上最多挂32个节点
  • 逻辑1:A-B > +200mV
  • 逻辑0:A-B < -200mV

注意:RS485是半双工的。也就是说,同一时刻只能有一个设备发送数据。我曾经在项目中遇到总线冲突的问题,排查了半天才发现是某个节点的发送使能引脚一直拉高,导致它一直在「抢麦」。

RS485和RS232的对比:

特性 RS232 RS485
传输方式 单端 差分
最大距离 15米 1200米
最大节点数 2(点对点) 32(标准)
电压范围 ±3V ~ ±15V ±200mV(差分)
工作模式 全双工 半双工

1.4 TTL电平与串口线序

这是最容易出问题的地方。TTL电平是芯片内部使用的电平标准,和RS232完全不同。

TTL电平:

  • 逻辑1:2.0V ~ 5.0V(通常3.3V或5V)
  • 逻辑0:0V ~ 0.8V
  • 正逻辑:高电平为1,低电平为0

你看,TTL和RS232的逻辑定义是反的。所以,如果你直接把TTL串口接到RS232设备上,轻则通信失败,重则烧毁芯片。

关键点:一定要用电平转换芯片,比如MAX232、SP3232。我习惯在原理图上用醒目的颜色标注电平域,提醒自己这里有个「坑」。

串口线序:

嗯,这里要特别注意。不同厂家的串口线,线序可能不一样。我遇到过最离谱的一次,两根「直连串口线」,内部线序竟然是反的。

常见的线序有两种:

  • 直连(DTE):2-RX、3-TX、5-GND
  • 交叉(DCE):2-TX、3-RX、5-GND

电脑通常是DTE设备,所以两台电脑直连需要用交叉线。调制解调器是DCE设备,电脑连调制解调器用直连线。

1.5 9针串口定义

DB9接口是RS232最常用的物理接口。虽然只有9个引脚,但实际通信只需要3根线:TX、RX、GND。

DB9引脚定义(公头/母头视角):

引脚号 信号 方向 说明
1 DCD 输入 载波检测
2 RXD 输入 接收数据
3 TXD 输出 发送数据
4 DTR 输出 数据终端就绪
5 GND - 信号地
6 DSR 输入 数据设备就绪
7 RTS 输出 请求发送
8 CTS 输入 清除发送
9 RI 输入 振铃指示

我的习惯:调试时只接2、3、5三根线。如果通信正常,再考虑接硬件流控。这样能快速定位问题。

知识体系总览

下面这张图,是我梳理的本章知识结构。你可以把它当作一个「串口知识地图」:

UART串口通信 UART协议原理 异步通信 数据帧结构 RS232标准 负逻辑 ±3V~±15V RS485标准 差分信号 半双工 TTL电平与线序 3.3V/5V逻辑 直连/交叉线 9针串口定义 2-RX, 3-TX, 5-GND 硬件流控引脚 电平匹配 + 线序正确 = 通信成功

这张图把本章的知识点串起来了。你可以看到,UART协议是基础,RS232和RS485是两种不同的电气标准,TTL电平是芯片内部用的,而DB9是物理接口。它们之间的关系,说白了就是「协议 → 电气 → 物理」三个层次。

避坑指南:我曾经在一个项目中,用了RS232的DB9接口,但板子上是TTL电平。结果接上电脑的串口,怎么都收不到数据。后来发现,中间少了一个MAX232电平转换芯片。嗯,从那以后,我画原理图时都会在串口部分加一个「电平域标注」。

好了,这一章的内容就到这里。串口的基础知识,说白了就是这些。下一章我们会深入Linux内核,看看串口驱动是怎么工作的。


专注资料整理