🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发
❄️作者主页:一个平凡而乐于分享的小比特的个人主页
✨收录专栏:通信协议,本专栏为记录项目中用到的知识点,以及一些硬件常识总结
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

串口通信全面详解
一、串口通信介绍
1.1 什么是串口通信?
串口通信(Serial Communication) 是一种古老但极其重要的数据通信方式,想象一下两位朋友通过摩尔斯电码发电报的过程:发送方将信息转换成一系列长短不一的信号(点和划),通过电线逐个发送出去;接收方听到这些信号后,再按照约定的规则将其转换回原始信息。
这就是串口通信的本质 :将数据拆分成单个的比特(bit) ,然后像珍珠项链一样一个接一个地通过单条线路传输。
1.2 串口通信的核心特征

1.3 为什么叫"串口"?
串行 vs 并行 对比理解:
并行通信(旧式打印机接口):
想象8个人并排跑步,同时到达终点
数据总线:8条线同时传输8位数据
优势:速度快
劣势:线多、易干扰、距离短
串行通信(USB、网络):
想象1个人来回跑8次运送8件物品
数据总线:1-2条线逐位传输
优势:线少、距离远、抗干扰
劣势:相对慢(但现代技术已极大提高速度)
有趣的事实:现代高速通信(如USB 3.0、PCIe、SATA)都采用串行方式,因为随着技术进步,串行通信的速度已远超并行通信!
二、串口通信基本原理
2.1 最简单的串口连接:三线制
设备A(发送方) 设备B(接收方)
┌─────────┐ ┌─────────┐
│ │ TX ────────► │ │
│ │ (发送数据) │ │
│ │ │ │
│ │ RX ◄──────── │ │
│ │ (接收数据) │ │
│ │ │ │
│ │ GND ────────► │ │
│ │ (共同参考地) │ │
└─────────┘ └─────────┘
关键要点:
- TX(Transmit):发送数据引脚
- RX(Receive):接收数据引脚
- GND(Ground):公共地线,确保电压参考一致
- 重要规则:A的TX连接B的RX,A的RX连接B的TX
2.2 数据是如何"串起来"的?
让我们看一个具体例子:发送字符'A'
字符'A'在计算机中的表示:
- ASCII码:65
- 二进制:01000001
串口发送过程分解:
步骤1:准备发送
设备A要发送字符'A' (01000001)
步骤2:添加包装
在数据前后加上"包装材料":
开始位(0) + 数据位(01000001) + 停止位(1)
步骤3:逐位发送
像传送带一样,一位一位送出:
0 → 1 → 0 → 0 → 0 → 0 → 0 → 1 → 1
│ 数据位 │
开始位 停止位
步骤4:接收还原
设备B看到:开始位(0) → 开始接收数据
收到8位数据后 → 看到停止位(1) → 接收完成
2.3 关键概念:异步通信
串口通信是异步的,这意味着:
-
没有统一的时钟信号告诉何时采样数据
-
双方事先约定好速度(波特率)
-
接收方靠检测起始位来开始接收
-
类似两个人约定好"每秒钟说一个字"
异步通信示意图:
发送方: 起 0 1 0 0 0 0 0 1 停
时间轴: | | | | | | | | | | |
接收方: 检测到"起"开始计时,按约定速度接收
三、串口通信基本概念
3.1 波特率(Baud Rate)------ 通信的"语速"
波特率 就像两个人说话的语速,单位是bps(bits per second,比特每秒)。
| 常用波特率 | 传输速度 | 典型应用场景 |
|---|---|---|
| 300 bps | 每秒300比特 | 老式调制解调器、电报 |
| 1200 bps | 每秒1200比特 | 早期计算机终端 |
| 9600 bps | 每秒9600比特 | 最常用,单片机、传感器 |
| 115200 bps | 每秒115.2K比特 | 高速串口、蓝牙模块 |
| 230400 bps | 每秒230.4K比特 | 高速数据采集 |
| 921600 bps | 每秒921.6K比特 | 最高速串口应用 |
波特率计算示例
9600波特率 = 每秒9600比特
传输一个字节(8位数据+起始停止位=10位)需要时间:
10位 ÷ 9600位/秒 ≈ 0.00104秒 = 1.04毫秒
115200波特率时:
10位 ÷ 115200位/秒 ≈ 0.0000868秒 = 86.8微秒
3.2 数据帧格式------数据的"包装盒"
一个完整的串口数据帧就像精心包装的礼物:
标准数据帧结构:
┌─────┬───────────────────┬─────┬──────────┐
│起始位│ 数据位 │校验位 │ 停止位 │
│(1位)│ (5-9位,通常8位) │(可选)│(1、1.5、2位)│
└─────┴───────────────────┴─────┴──────────┘
详细拆解数据帧:
最常用配置:8-N-1
8: 8位数据位
N: 无校验位
1: 1位停止位
实际传输示例:发送数字65(字符'A')
┌─── ┬─┬─┬─┬─┬─┬─┬─┬─┬───┐
│起 │0│1│0│0│0│0│0│1│停 │
│始 │ │ │ │ │ │ │ │ │止 │
│位 │D7│D6│D5│D4│D3│D2│D1│D0│位 │
└───┴─┴─┴─┴─┴─┴─┴─┴─┴───┘
数据位长度(5-9位)
| 数据位长度 | 说明 | 应用场景 |
|---|---|---|
| 5位 | 早期电报码、特殊设备 | 老式电传打字机 |
| 6位 | 较少使用 | 特殊行业设备 |
| 7位 | 标准ASCII字符 | 文本传输、终端 |
| 8位 | 最常用,一个字节 | 二进制数据、图像、文件 |
| 9位 | 特殊用途 | 多处理器通信 |
校验位------数据的"质检员"
校验位用于检测传输过程中的错误:
| 校验类型 | 工作原理 | 示意图 | 应用场景 |
|---|---|---|---|
| 无(N) | 不校验 | - | 大多数应用,可靠性要求不高 |
| 偶校验(E) | 保证1的个数为偶数 | 数据:01000001(有2个1) → 校验位:0 | 需要基本错误检测 |
| 奇校验(O) | 保证1的个数为奇数 | 数据:01000001(有2个1) → 校验位:1 | 需要基本错误检测 |
| 标记(M) | 校验位固定为1 | 总是1 | 特殊协议 |
| 空格(S) | 校验位固定为0 | 总是0 | 特殊协议 |
校验位计算示例:
发送数据:01000001 (字符'A')
包含的1:D7=0, D6=1, D5=0, D4=0, D3=0, D2=0, D1=0, D0=1
1的个数:2个
偶校验:1的个数已经是偶数(2),校验位=0
奇校验:需要凑成奇数,校验位=1
实际发送(偶校验):
起始位(0) + 数据(01000001) + 校验位(0) + 停止位(1)
停止位(1、1.5、2位)
停止位像句子结束的句号,告诉接收方"数据结束了":
| 停止位长度 | 说明 | 典型应用 |
|---|---|---|
| 1位 | 最常用 | 大多数现代应用 |
| 1.5位 | 较少使用 | 某些老式设备 |
| 2位 | 增加可靠性 | 噪声环境、长距离 |
3.3 流控制------通信的"交通信号灯"
当发送方太快,接收方处理不及时时,需要流控制:
无流控制的问题:
发送方:数据数据数据数据数据...
接收方:处理不过来!缓冲区满了!
结果:数据丢失
两种流控制方式:
硬件流控制(RTS/CTS):
发送方(设备A) 接收方(设备B)
│ │
├─── TX(数据) ────────────► │
│ │
├─── RTS(请求发送) ────────► │
│ "我可以发数据吗?" │
│ │
│◄──── CTS(清除发送) ──────── ┤
│ "可以,发吧!" │
└────────────────────────────────┘
软件流控制(XON/XOFF):
发送方 接收方
│ │
│─── 数据数据数据 ──────► │
│ │
│◄──── XOFF (0x13) ──────── ┤
│ "暂停发送!" │(缓冲区快满了)
│ │
│ 暂停... │ 处理数据...
│ │
│◄──── XON (0x11) ───────── ┤
│ "可以继续了" │(缓冲区有空了)
│ │
│─── 继续发送 ────────► │
3.4 实际应用配置示例
场景一:Arduino与电脑通信
Arduino配置:
波特率:9600
数据位:8位
校验位:无
停止位:1位
流控制:无
电脑串口助手配置相同即可通信
场景二:工业传感器读取
温湿度传感器配置:
波特率:4800(低功耗)
数据位:8位
校验位:偶校验(提高可靠性)
停止位:2位(抗干扰)
流控制:无
四、串口通信的工作流程
4.1 发送端完整工作流程
步骤1:准备数据
例如:要发送字符串"HELLO"
步骤2:转换为字节序列
'H' → 0x48 → 01001000
'E' → 0x45 → 01000101
'L' → 0x4C → 01001100
'L' → 0x4C → 01001100
'O' → 0x4F → 01001111
步骤3:按帧逐个发送
帧1:起始位(0) + 01001000 + 停止位(1)
等待 → 帧2:起始位(0) + 01000101 + 停止位(1)
... 直到所有字节发送完毕
步骤4:线路恢复
发送完成后,TX线保持高电平(空闲状态)
4.2 接收端完整工作流程
步骤1:检测起始位
持续监测RX线,等待从高电平变为低电平
(高电平是空闲状态,低电平表示起始位)
步骤2:开始计时
检测到起始位后,等待1.5个位时间
(到达第一个数据位中间位置,避开边沿)
步骤3:采样数据位
每1个位时间采样一次,共采样8次
得到8位数据
步骤4:检查停止位
采样停止位,应该是高电平
如果不是,报告帧错误
步骤5:处理数据
去除起始位和停止位,得到8位有效数据
存储到接收缓冲区
接收时序精确定时:
9600波特率,1位时间 = 1/9600 ≈ 104微秒
接收过程:
1. 检测起始位下降沿
2. 等待104×1.5 = 156微秒(到达D0位中间)
3. 每隔104微秒采样一次:D0, D1, D2... D7
4. 采样停止位
5. 回到步骤1,等待下一个字节
五、串口通信实际应用场景
5.1 场景一:单片机调试与监控
应用:通过串口查看Arduino运行状态
硬件连接:USB转串口线连接电脑和Arduino
配置:9600 8N1
工作流程:
1. 传感器读取温度 → 25°C
2. Arduino格式化为字符串:"Temp:25C\n"
3. 通过串口发送到电脑
4. 串口助手显示:Temp:25C
5.2 场景二:智能家居设备配置
应用:配置Wi-Fi模块的SSID和密码
设备:ESP8266 WiFi模块
通信过程:
电脑发送:AT+CWJAP="MyWiFi","password123"<回车>
模块回复:OK
电脑发送:AT+CIPSTART="TCP","api.weather.com",80
模块回复:CONNECT
5.3 场景三:工业数据采集系统
应用:生产线温度监控
系统组成:
多个温度传感器 → RS485转换器 → 串口 → 工控机
配置:19200波特率,8位数据,偶校验,2位停止位
优势:抗干扰强,适合工业环境
5.4 场景四:GPS导航设备
应用:车载GPS接收器
数据格式:NMEA 0183标准
波特率:4800(标准GPS)或9600(高更新率)
数据示例:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
特点:连续发送,无需请求
六、常见问题与解决方案
6.1 通信问题排查清单
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 完全无数据 | 波特率不匹配 | 检查双方波特率设置 |
| 收到乱码 | 数据格式不一致 | 检查数据位、校验位、停止位 |
| 数据丢失 | 波特率过高 | 降低波特率 |
| 偶尔错误 | 线路干扰 | 缩短线长,加屏蔽,降低波特率 |
| 只能收不能发 | TX/RX接反 | 交换TX和RX线 |
| 电脑无法识别 | 驱动问题 | 安装正确USB转串口驱动 |
6.2 波特率误差容忍度
串口通信对波特率误差有一定容忍度,但有限制:
理想情况:发送和接收波特率完全一致
实际情况:存在晶振误差
误差计算公式:
误差百分比 = |(实际波特率 - 标称波特率)| / 标称波特率 × 100%
安全范围:通常要求误差 < 2-3%
示例:标称9600波特率
发送方实际:9600 × (1+2%) = 9792
接收方实际:9600 × (1-2%) = 9408
实际误差:约4%,可能通信失败
6.3 线路长度与波特率关系
| 波特率 | 推荐最大线长 | 理论极限 |
|---|---|---|
| 115200 bps | 5-10米 | 20米(屏蔽线) |
| 57600 bps | 10-20米 | 50米 |
| 19200 bps | 50米 | 100米 |
| 9600 bps | 100米 | 200米 |
| 2400 bps | 300米 | 500米 |
| 300 bps | 1000米 | 1500米 |
提示:使用双绞线、屏蔽线可延长通信距离。
七、串口通信配置总结
7.1 最常用配置
9600 8N1(90%的应用场景)
含义:
- 波特率:9600 bps
- 数据位:8位
- 校验位:无
- 停止位:1位
- 流控制:无
7.2 特殊需求配置参考
| 需求 | 推荐配置 | 理由 |
|---|---|---|
| 高可靠性 | 9600 8E2 | 偶校验+2停止位,错误检测强 |
| 长距离传输 | 2400 8N2 | 低波特率+2停止位,抗干扰 |
| 文本传输 | 9600 7E1 | 7位ASCII+偶校验,效率高 |
| 二进制数据 | 115200 8N1 | 高速+完整字节 |
| 噪声环境 | 4800 8O2 | 低速率+奇校验+2停止位 |
7.3 配置记忆口诀
"波特率要对等,格式要相同"
"TX连RX别接反,地线要连通"
"高速短距离,低速能远传"
"校验加停止,可靠又安全"
总结
串口通信就像数字世界的"摩尔斯电码",虽然简单但功能强大。它的核心思想是:逐位发送、异步协调、格式约定。
记住三个关键数字:
- 9600:最常用的波特率
- 8N1:最常用的数据格式(8位数据、无校验、1位停止)
- 3线:最基本的连接方式(TX、RX、GND)
串口通信历经数十年发展,至今仍在嵌入式系统、工业控制、设备调试等领域发挥着不可替代的作用。它的简单性、可靠性、灵活性使其成为工程师工具箱中必备的通信工具。
停止位,抗干扰 |
| 文本传输 | 9600 7E1 | 7位ASCII+偶校验,效率高 |
| 二进制数据 | 115200 8N1 | 高速+完整字节 |
| 噪声环境 | 4800 8O2 | 低速率+奇校验+2停止位 |
7.3 配置记忆口诀
"波特率要对等,格式要相同"
"TX连RX别接反,地线要连通"
"高速短距离,低速能远传"
"校验加停止,可靠又安全"
总结
串口通信就像数字世界的"摩尔斯电码",虽然简单但功能强大。它的核心思想是:逐位发送、异步协调、格式约定。
记住三个关键数字:
- 9600:最常用的波特率
- 8N1:最常用的数据格式(8位数据、无校验、1位停止)
- 3线:最基本的连接方式(TX、RX、GND)
串口通信历经数十年发展,至今仍在嵌入式系统、工业控制、设备调试等领域发挥着不可替代的作用。它的简单性、可靠性、灵活性使其成为工程师工具箱中必备的通信工具。
无论是让单片机"开口说话",还是连接各种智能设备,只要掌握了串口通信的基本原理和配置方法,你就能让不同的电子设备相互"理解",实现数据的顺畅交流。