串口通信全面详解

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,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别接反,地线要连通"
"高速短距离,低速能远传"
"校验加停止,可靠又安全"

总结

串口通信就像数字世界的"摩尔斯电码",虽然简单但功能强大。它的核心思想是:逐位发送、异步协调、格式约定

记住三个关键数字

  1. 9600:最常用的波特率
  2. 8N1:最常用的数据格式(8位数据、无校验、1位停止)
  3. 3线:最基本的连接方式(TX、RX、GND)

串口通信历经数十年发展,至今仍在嵌入式系统、工业控制、设备调试等领域发挥着不可替代的作用。它的简单性、可靠性、灵活性使其成为工程师工具箱中必备的通信工具。

停止位,抗干扰 |

| 文本传输 | 9600 7E1 | 7位ASCII+偶校验,效率高 |

| 二进制数据 | 115200 8N1 | 高速+完整字节 |

| 噪声环境 | 4800 8O2 | 低速率+奇校验+2停止位 |

7.3 配置记忆口诀

复制代码
"波特率要对等,格式要相同"
"TX连RX别接反,地线要连通"
"高速短距离,低速能远传"
"校验加停止,可靠又安全"

总结

串口通信就像数字世界的"摩尔斯电码",虽然简单但功能强大。它的核心思想是:逐位发送、异步协调、格式约定

记住三个关键数字

  1. 9600:最常用的波特率
  2. 8N1:最常用的数据格式(8位数据、无校验、1位停止)
  3. 3线:最基本的连接方式(TX、RX、GND)

串口通信历经数十年发展,至今仍在嵌入式系统、工业控制、设备调试等领域发挥着不可替代的作用。它的简单性、可靠性、灵活性使其成为工程师工具箱中必备的通信工具。

无论是让单片机"开口说话",还是连接各种智能设备,只要掌握了串口通信的基本原理和配置方法,你就能让不同的电子设备相互"理解",实现数据的顺畅交流。

相关推荐
Terasic友晶科技20 天前
1-串行通信基础知识
fpga开发·串口通信·异步通信·串行通信·同步通信·并行通信·单工
BreezeJuvenile22 天前
嵌入式系统-实验三——串口通信实验
stm32·单片机·串口通信·标准库·嵌入式系统实验
【ql君】qlexcel1 个月前
UART通讯协议,停止位、校验位
串口通信·uart·停止位·校验位
疯狂的Alex2 个月前
【C#避坑实战系列文章15】C# WinForm 上位机开发:解决串口粘包+LiveCharts卡顿+InfluxDB存储(免费代码+仿真工具)
sqlite·c#·上位机·串口通信·livechars·c#硬件对接
【ql君】qlexcel2 个月前
虚拟串口工具vspd
串口通信·虚拟串口·vspd·串口互发
一川月白7093 个月前
51单片机---硬件学习(电子琴、主从应答模式、modbus模型、DS18B20传感器显示温度)
嵌入式硬件·51单片机·串口通信·异步通信·串行通信·同步通信·并行通信
sheepwjl3 个月前
《嵌入式硬件(三):串口通信》
网络·嵌入式硬件·网络协议·串口通信
楚Y6同学4 个月前
QT之键盘控制虚拟遥控系统开发总结
开发语言·c++·qt·串口通信
棋影4 个月前
主流PLC串口自由协议通信标准化
串口通信·plc通信·modbus通信