Veloris.
返回索引
概念基础 2025-04-26

串口通信协议入门:两根线如何让设备"对话"

12 分钟
3.9k words

串口通信协议入门:两根线如何让设备”对话”

前言

你刚拿到一块 FPGA 开发板,想让它跟电脑”说句话”。打开教程,第一步就是——配置串口。波特率 115200,8N1,打开串口助手,发送一个 0x55……

等等,这些数字都是什么意思?“8N1”是什么暗号?为什么只要两根线就能让两个设备互相通信?

这些问题,归根结底都指向同一个东西——串口通信协议

这篇文章会带你从零搞懂串口通信:它是什么、数据帧怎么工作、RS-232 / RS-485 / UART 这些名字之间到底是什么关系,以及你在 FPGA 开发中最常用到的 UART 到底是怎么回事。


串口通信是什么

串口通信(Serial Communication)是指数据按**一位一位(bit by bit)**的顺序,通过串行接口在两台设备之间传输的通信方式。

你可以把它想象成一条单车道公路:车辆(数据位)只能排成一列依次通过,而不能多辆车并排走。与之对应的是并行通信——多车道高速公路,多个数据位同时传输。

串行 vs 并行传输

那为什么不全用”多车道”的并行通信呢?因为车道越多,修路(布线)成本越高,而且车速一快(频率高),相邻车道还会互相干扰(串扰)。串口通信只需要很少的线(最少两根),硬件简单、成本低,尤其适合远距离资源受限的场景。

串口通信协议不仅仅是”用串行方式发数据”这么简单。它是一套完整的规则,定义了:

  • 数据帧格式:一次传输的数据长什么样(起始位、数据位、校验位、停止位)
  • 同步方式:发送方和接收方怎么对齐节拍
  • 错误检测:怎么发现传输过程中的数据出错

💡 工程师手记我第一次真正理解”协议”这个词,是在调试串口的时候。之前觉得协议就是一堆规则,很抽象。但当你亲眼看到串口助手里跳出正确的数据,就会明白——协议就是两个设备之间的”约定”,约定好了才能听懂对方在说什么。


串口通信的三种方向模式

在了解具体协议之前,你需要先知道数据传输的”方向性”。根据方向不同,串口通信分为三种模式:

  • 单工(Simplex):数据只能单向传输。就像广播电台,只能台里往外播,听众不能回话。
  • 半双工(Half-Duplex):数据可以双向传输,但不能同时进行——你说完我再说,像对讲机。典型代表:RS-485
  • 全双工(Full-Duplex):数据可以双向同时传输——你说你的,我说我的,互不干扰,像打电话。典型代表:RS-232UART

单工/半双工/全双工

数据帧:串口通信的”信封格式”

串口通信中,数据不是散着发的,而是被打包成一个个数据帧(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 发送一个字节数据的完整过程:

uart.gif 图片来源: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 教程的经典入门项目
  • 如果你想了解更多通信协议,可以继续学习 SPII2C,它们和 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。


参考资料


系列导航:本文是「通信协议入门系列」的第 1 篇。后续文章将深入讲解 SPI、I2C 等协议,以及如何在 FPGA 上用 Verilog 实现一个完整的 UART 收发器。

如果这篇文章对你有帮助,欢迎收藏、点赞或留言交流。有任何疑问也可以在评论区提出,我会尽量回复。

End of file.