一、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协议是基础,RS232和RS485是两种不同的电气标准,TTL电平是芯片内部用的,而DB9是物理接口。它们之间的关系,说白了就是「协议 → 电气 → 物理」三个层次。
避坑指南:我曾经在一个项目中,用了RS232的DB9接口,但板子上是TTL电平。结果接上电脑的串口,怎么都收不到数据。后来发现,中间少了一个MAX232电平转换芯片。嗯,从那以后,我画原理图时都会在串口部分加一个「电平域标注」。
好了,这一章的内容就到这里。串口的基础知识,说白了就是这些。下一章我们会深入Linux内核,看看串口驱动是怎么工作的。