串口通信协议入门:两根线如何让设备”对话”
前言
你刚拿到一块 FPGA 开发板,想让它跟电脑”说句话”。打开教程,第一步就是——配置串口。波特率 115200,8N1,打开串口助手,发送一个 0x55……
等等,这些数字都是什么意思?“8N1”是什么暗号?为什么只要两根线就能让两个设备互相通信?
这些问题,归根结底都指向同一个东西——串口通信协议。
这篇文章会带你从零搞懂串口通信:它是什么、数据帧怎么工作、RS-232 / RS-485 / UART 这些名字之间到底是什么关系,以及你在 FPGA 开发中最常用到的 UART 到底是怎么回事。
串口通信是什么
串口通信(Serial Communication)是指数据按**一位一位(bit by bit)**的顺序,通过串行接口在两台设备之间传输的通信方式。
你可以把它想象成一条单车道公路:车辆(数据位)只能排成一列依次通过,而不能多辆车并排走。与之对应的是并行通信——多车道高速公路,多个数据位同时传输。

那为什么不全用”多车道”的并行通信呢?因为车道越多,修路(布线)成本越高,而且车速一快(频率高),相邻车道还会互相干扰(串扰)。串口通信只需要很少的线(最少两根),硬件简单、成本低,尤其适合远距离和资源受限的场景。
串口通信协议不仅仅是”用串行方式发数据”这么简单。它是一套完整的规则,定义了:
- 数据帧格式:一次传输的数据长什么样(起始位、数据位、校验位、停止位)
- 同步方式:发送方和接收方怎么对齐节拍
- 错误检测:怎么发现传输过程中的数据出错
💡 工程师手记:我第一次真正理解”协议”这个词,是在调试串口的时候。之前觉得协议就是一堆规则,很抽象。但当你亲眼看到串口助手里跳出正确的数据,就会明白——协议就是两个设备之间的”约定”,约定好了才能听懂对方在说什么。
串口通信的三种方向模式
在了解具体协议之前,你需要先知道数据传输的”方向性”。根据方向不同,串口通信分为三种模式:
- 单工(Simplex):数据只能单向传输。就像广播电台,只能台里往外播,听众不能回话。
- 半双工(Half-Duplex):数据可以双向传输,但不能同时进行——你说完我再说,像对讲机。典型代表:RS-485。
- 全双工(Full-Duplex):数据可以双向同时传输——你说你的,我说我的,互不干扰,像打电话。典型代表:RS-232、UART。
数据帧:串口通信的”信封格式”
串口通信中,数据不是散着发的,而是被打包成一个个数据帧(Frame),就像写信要装进信封一样。每个数据帧都有固定的格式,让接收方知道”从哪里开始读、读多少、到哪里结束”。
以最常见的 8N1 格式(8 个数据位、无校验、1 个停止位)为例,一个数据帧长这样:
空闲(高电平) ──┐ ┌── 空闲(高电平)
│ │
| 起始位(0) | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 停止位(1) |
↑ ↑
下降沿触发 恢复高电平
各部分的含义:
- 起始位(Start Bit):1 位低电平(逻辑 0)。它的作用是告诉接收方:“注意,数据来了!“接收方检测到从高电平到低电平的下降沿,就知道一帧数据开始了。
- 数据位(Data Bits):5~8 位有效数据,最常用 8 位。注意,数据是低位先发(LSB First),即 D0(最低有效位)最先发送,D7(最高有效位)最后发送。
- 校验位(Parity Bit,可选):用于简单的错误检测。分为奇校验(Odd Parity)和偶校验(Even Parity),通过统计数据位中”1”的个数来判断是否出错。
- 停止位(Stop Bit):1~2 位高电平(逻辑 1)。标志一帧数据的结束,同时为下一帧的起始位检测留出准备时间。
💬 你可能会问:8N1 是什么意思?
“8”表示 8 个数据位,“N”表示 No Parity(无校验),“1”表示 1 个停止位。这是串口通信中最常见的配置,你在串口助手里看到的默认设置基本都是它。
关键参数
要让两个设备正常通信,双方必须使用完全相同的参数配置。最核心的几个参数:
波特率(Baud Rate):每秒传输的码元(symbol)数,单位是 Baud。在串口通信中,由于每个码元通常携带 1 bit 信息,所以波特率在数值上等于比特率(Bit Rate)。常用的波特率有 9600、19200、38400、57600、115200 Baud。以 9600 Baud 为例,每个 bit 的持续时间约为 1/9600 ≈ 104.17 μs。
💬 你可能会问:波特率和比特率是一回事吗?
严格来说不是。波特率是每秒传输的码元数(Baud),比特率是每秒传输的比特数(bps)。当每个码元只携带 1 bit 信息时(串口通信的常见情况),两者数值相等。但在调制通信(如 QAM)中,一个码元可以携带多个 bit,此时比特率 > 波特率。对于串口通信的日常使用,你可以认为它们是一样的。
其他参数一览:
| 参数 | 说明 | 常用值 |
|---|---|---|
| 数据位宽 | 每帧中实际数据的位数 | 8 位 |
| 校验方式 | 错误检测方式 | 无校验 / 奇校验 / 偶校验 |
| 停止位数 | 每帧结束时的停止位个数 | 1 位或 2 位 |
💡 工程师手记:串口调试时最常见的”翻车现场”就是波特率没对齐——串口助手里显示的全是乱码。如果你遇到乱码,第一件事就是检查收发双方的波特率是否一致,这能解决 80% 的问题。
物理层标准:RS-232、RS-422、RS-485 与 UART 的关系
这是很多初学者最容易混淆的地方,也是理解串口通信的关键所在。
先说结论:RS-232、RS-422、RS-485 是物理层标准,定义的是电气特性(电压、信号类型、连接器);UART 是数据链路层的协议/硬件模块,定义的是数据帧格式和收发逻辑。 它们不在同一个层面上,不能简单并列。
打个比方:
- RS-232 / RS-485 相当于”公路的类型”——高速公路还是乡间小道,决定了车能跑多快、能跑多远。
- UART 相当于”交通规则”——红灯停绿灯行、靠右行驶,决定了车怎么有序通行。
公路类型和交通规则是两件事,但它们配合在一起才能让交通运转。同样,UART 协议需要搭配一种物理层标准才能实际传输数据。
三大物理层标准
RS-232——最经典的老前辈
RS-232 是最早普及的串行通信标准,你在老式电脑后面看到的那个 9 针(DB-9)接口就是它。它使用单端信号,采用负逻辑:逻辑”1”对应 -3V~-15V,逻辑”0”对应 +3V~+15V。
- 适用场景:计算机与外设之间的短距离点对点连接
- 传输距离:≤15m
- 局限:单端信号抗干扰能力弱,在嘈杂的工业环境中容易出错
RS-422——RS-232 的”增强版”
RS-422 针对 RS-232 的短板做了改进,最大的变化是引入了差分信号传输。差分信号用两根线(A、B)的电压差来表示数据,环境噪声会同时作用在两根线上被抵消,因此抗干扰能力大幅提升。
- 适用场景:需要远距离、高可靠的点对点通信
- 传输距离:≤1200m
- 特点:支持更高的传输速率,但仍然是点对点拓扑
RS-485——工业现场的”主力军”
RS-485 在 RS-422 的基础上更进一步,支持多点总线拓扑——最多 32 个设备可以挂在同一条总线上。这让它成为工业控制领域的标配。
- 适用场景:工厂车间、楼宇自动化等多设备组网场景
- 传输距离:≤1200m
- 通信方式:通常为半双工(两根线),也可实现全双工(四根线)
物理层标准对比
| 标准 | 信号类型 | 电平范围 | 传输距离 | 拓扑结构 | 抗干扰能力 |
|---|---|---|---|---|---|
| RS-232 | 单端 | ±3V~±15V | ≤15m | 点对点 | 弱 |
| RS-422 | 差分 | ±1.5V 差分 | ≤1200m | 点对点 | 强 |
| RS-485 | 差分 | ±1.5V 差分 | ≤1200m | 多点总线 | 强 |
💬 你可能会问:那 UART-TTL 电平是什么?
TTL 电平(0V/3.3V 或 0V/5V)是芯片内部最原始的信号电平。你的 FPGA 或 MCU 内部的 UART 模块输出的就是 TTL 电平信号,但 TTL 电平只能在极短距离(≤1m,通常是 PCB 板级)内传输。如果需要远距离通信,就要通过电平转换芯片(如 MAX232、MAX485)将 TTL 电平转换为 RS-232 或 RS-485 电平。
聚焦 UART:FPGA 开发中最常用的串口方案
UART(Universal Asynchronous Receiver-Transmitter,通用异步收发传输器)是一种异步串行通信协议,同时也是实现该协议的硬件模块的名称。
为什么说它是 FPGA 开发者的”老朋友”?因为:
- 只需两根线:TX(发送)和 RX(接收),硬件极简
- 异步通信:不需要额外的时钟线,省资源
- 全双工:收发同时进行,效率高
- 广泛支持:几乎所有 MCU、FPGA 开发板都自带 UART 接口,是调试的首选通道
UART 通信的完整过程
下面我们一步步拆解 UART 发送一个字节数据的完整过程:
图片来源:I2C, UART et SPI : comparaison des avantages et des limites
Step 1 — 空闲状态:没有数据传输时,TX 线保持高电平。这是串口的默认状态。
Step 2 — 起始位:发送方将 TX 线从高电平拉到低电平,保持一个 bit 时间。接收方检测到这个下降沿后,就知道”一帧数据要来了”,开始按约定的波特率采样后续数据。
Step 3 — 数据位:紧跟起始位之后,发送方逐位发送实际数据。发送顺序是 LSB First(最低有效位优先),即 D0(Bit 0,LSB)先发,D7(Bit 7,MSB)最后发。
Step 4 — 校验位(可选):如果配置了校验,发送方会在数据位之后附加一个校验位,接收方据此判断数据在传输过程中是否出错。
Step 5 — 停止位:发送方将 TX 线拉回高电平,保持至少一个 bit 时间,标志这一帧结束。之后线路回到空闲状态,等待下一帧。
两个 UART 设备之间的波特率差异不应超过 ±3%(宽松标准为 ±5%),否则接收方的采样时刻会偏移到相邻 bit,导致数据错误。这就是为什么串口通信对波特率匹配要求很严格。
UART 的局限性
UART 虽然简单好用,但它也有明显的短板,你在选型时需要心里有数:
- 速率有限:常规使用中最高 115200 bps(部分芯片可达 1~3 Mbps),远不如 SPI 和并行通信
- 点对点:一个 UART 接口只能连一个设备,不支持总线组网(需要组网请选 RS-485)
- 无硬件流控:标准 UART 没有流控机制(RTS/CTS 是扩展),如果接收方来不及处理,数据可能丢失
- 异步的代价:没有时钟线意味着收发双方必须严格约定波特率,否则必然出错
💡 工程师手记:在 FPGA 项目中,UART 最常见的用途就是调试——用它把内部信号的值打印到电脑上的串口助手里。如果你需要高速传输大量数据,UART 就力不从心了,那时候你可能需要考虑 SPI、I2C,甚至以太网。
(建议替换为你自己的真实经历,读者会更有共鸣)
选型指南:什么场景用什么协议
了解了各种标准和 UART 之后,一个实际问题来了:我的项目到底该选哪个?
这里给一个简单的决策思路:
- FPGA/MCU 板级调试、短距离设备间通信 → UART(TTL 电平)。最简单,两根线搞定。
- FPGA/MCU 连接电脑(距离 < 15m) → UART + RS-232 电平转换。经典方案,兼容老设备。
- 工业现场、多设备组网、长距离(> 15m) → RS-485。抗干扰强,支持总线拓扑。
- 点对点长距离、高速率 → RS-422。比 RS-485 更适合高速点对点场景。
总结
串口通信是嵌入式和 FPGA 开发中最基础、最常用的通信方式之一。这篇文章的核心知识点:
| 概念 | 一句话总结 |
|---|---|
| 串口通信 | 数据按位依次传输的通信方式,硬件简单、成本低 |
| 数据帧(8N1) | 起始位(1) + 数据位(8) + 停止位(1),最常见的帧格式 |
| 物理层标准 | RS-232(短距离)、RS-422(远距离点对点)、RS-485(远距离多点总线) |
| UART | 异步串行通信协议 + 硬件模块,只需 TX/RX 两根线,FPGA 调试首选 |
| 波特率 | 收发双方必须一致,否则乱码 |
下一步建议:
- 如果你是 FPGA 学习者,下一步可以尝试用 Verilog 实现一个 UART 收发器——这是几乎所有 FPGA 教程的经典入门项目
- 如果你想了解更多通信协议,可以继续学习 SPI 和 I2C,它们和 UART 一起构成了嵌入式通信的”三驾马车”
常见问题(FAQ)
Q1:串口和 UART 是一回事吗?
不完全是。“串口”是一个宽泛的概念,泛指所有串行通信接口(包括 RS-232、RS-485、USB 等)。UART 只是串口通信中的一种具体实现方式。日常口语中大家说的”串口”,通常指的是 UART 串口。
Q2:为什么我在串口助手里看到的是乱码?
90% 的原因是波特率不匹配。请确认:发送方和接收方的波特率、数据位、校验位、停止位设置完全一致。另外也检查一下 TX/RX 是否接反了(发送方的 TX 要接接收方的 RX)。
Q3:UART 的最高速率是多少?
标准 UART 常用的最高波特率是 115200 Baud。但很多现代芯片(如 STM32、FPGA)支持更高的非标波特率,可达 1Mbps 甚至 3Mbps。实际能跑多快取决于硬件和线路质量。
Q4:RS-232 和 TTL 电平有什么区别?能直接连吗?
不能直接连!RS-232 的逻辑”1”是负电压(-3V~-15V),TTL 的逻辑”1”是正电压(3.3V 或 5V)。直连可能损坏芯片。需要通过电平转换芯片(如 MAX232)进行转换。
Q5:异步通信没有时钟,接收方怎么知道什么时候采样?
靠起始位的下降沿触发同步。接收方检测到下降沿后,按约定的波特率在每个 bit 的中间时刻进行采样(通常是 16 倍过采样,取中间点)。这就是为什么波特率必须匹配——如果频率差太多,采样点会逐渐偏移,最终采到错误的 bit。
参考资料
- UART Communication Protocol - Analog Devices Wiki
- RS-232 Standard - Wikipedia
- RS-485 Standard - Wikipedia
- I2C, UART et SPI : comparaison des avantages et des limites
系列导航:本文是「通信协议入门系列」的第 1 篇。后续文章将深入讲解 SPI、I2C 等协议,以及如何在 FPGA 上用 Verilog 实现一个完整的 UART 收发器。
如果这篇文章对你有帮助,欢迎收藏、点赞或留言交流。有任何疑问也可以在评论区提出,我会尽量回复。
