没人教你的串口技巧:3 个冷门概念,让通信效率直接翻倍
1.串口流控
“流” 指 “数据流”。当收发双方速率不匹配(如接收端处理速度慢于发送端),接收端缓冲区会 “溢出”,导致数据丢失。“流控” 的核心是 “让发送端根据接收端状态,动态调整发送行为”。
- 硬件流控:通过专用引脚信号控制,最常用的是
RTS/CTS(请求发送 / 清除发送) 流控,原理是 “接收端用CTS告诉发送端‘是否能发’,发送端用RTS请求‘能否发’”。-
常见信号定义如下:
RTS(Request To Send):发送端向接收端请求 “允许发送”(如MCU给 “串口模组” 发RTS低电平,表示 “我准备好收了,你可以发”)。CTS(Clear To Send):接收端向发送端回应 “允许发送”(如 “串口模组” 给MCU发CTS低电平,表示 “我准备好发了,你可以收”)。
-
工作逻辑:接收端会设置 “缓冲区高位(如缓存占比 75%)” 和 “缓冲区低位(如缓存占比 25%)”:
- 当接收端缓存 “≥ 高位”,就把
RTS 置为高电平(表示 “我缓存快满了,别发了”);发送端检测到RTS高电平,就停止发送。 - 当接收端缓存 “≤ 低位”,就把
RTS 置为低电平表示 “我缓存有空了,继续发”);发送端检测到RTS低电平,就恢复发送。
![]()
- 当接收端缓存 “≥ 高位”,就把
-
注:硬件流控需 “通信双方硬件支持
RTS/CTS引脚”,且接线时要 “交叉连接”(如MCU的RTS连串口模组的CTS,MCU的CTS连串口模组的RTS)。
-
- 软件流控:通过特殊字符控制,当硬件不支持流控引脚时,用
XON/XOFF字符 实现(XON表示 “继续发”,XOFF表示 “停止发”)。-
工作逻辑:
![]()
- 接收端缓存 “≥ 高位” 时,向发送端发XOFF 字符(十进制 19,或 Control - S);发送端收到 XOFF,立即停止发送。
- 接收端缓存 “≤ 低位” 时,向发送端发XON 字符(十进制 17,或 Control - Q);发送端收到 XON,立即恢复发送。
-
2.数据校验
传输过程中,电磁干扰、线路损耗等会导致 “数据位错误”。“数据校验” 通过 “增加冗余信息”,让接收端能 “检测甚至纠正错误”。常见校验方式如下:
-
奇偶校验(Parity Check)
![]()
- 原理:在 “有效数据” 后附加1 个校验位,使 “有效数据 + 校验位” 中 “1 的个数” 满足 “奇 / 偶” 约定。
- 偶校验:“有效数据 + 校验位” 中,1 的个数为偶数(例:有效数据 “0001” 含 1 个 1,校验位需为 1 → 总个数 2,偶数)。
- 奇校验:“有效数据 + 校验位” 中,1 的个数为奇数(例:有效数据 “0001” 含 1 个 1,校验位需为 0 → 总个数 1,奇数)。
- 特点:仅能 “检测 1 位错误”,若多数据位同时出错,可能无法检测;且无法 “纠错”,只能 “检错”。
-
CRC 校验(循环冗余校验)
![]()
- 原理:利用 “除法余数” 原理,对 “有效数据” 做 “多项式运算”,生成
CRC 校验码(随数据一同发送);接收端对 “收到的数据” 重复相同运算,若 “计算出的CRC” 与 “收到的CRC” 不一致,则判定 “数据错误”。 - 常见标准:
CRC-12(12 位校验码)、CRC-16(16 位)、CRC-CCITT(16 位,常用于通信领域)、CRC-32(32 位,常用于文件校验)。 - 特点:检错能力强,能检测 “多位错误、突发错误”,但仅能 “检错”,无法 “纠错”。
- 原理:利用 “除法余数” 原理,对 “有效数据” 做 “多项式运算”,生成
-
异或校验和(XOR 校验)
![]()
- 原理:对 “数据字的所有字节” 逐字节做异或运算,生成 1 个字节的 “校验和”(也叫 “纵向冗余校验 LRC”)。
- 示例:数据字为
Byte₀, Byte₁, Byte₂, …, Byteₙ,校验和 =Byte₀ ⊕ Byte₁ ⊕ Byte₂ ⊕ … ⊕ Byteₙ(“⊕” 为异或运算符)。 - 特点:实现简单,适合 “短数据、低功耗” 场景;但检错能力弱于 CRC,多用于对可靠性要求不极端的场合。
3.提升通信吞吐量的 “流水线” 思路
串口通信的 “吞吐量” 指 “单位时间传输的数据量”。传统 “主机发 → 从机收 → 从机回复 → 主机收” 的串行流程,会因 “等待回复” 产生大量空闲时间,导致效率低下。通过 “流水线化” 改造,可显著提升吞吐量。
-
传统流程 vs 流水线流程(时间维度对比)
- 传统流程:发送端(主机)发 “第 1 帧”→ 接收端(从机)收 “第 1 帧”→ 从机处理 “第 1 帧”→ 从机回复 “第 1 帧”→ 主机收回复 → 再发 “第 2 帧”……(每帧之间有大量 “红色空闲时间”)。
![]()
- 流水线流程:发送端无需等 “前一帧回复完成”,只要 “相邻帧间隔足够”,就可连续发 “第 1 帧、第 2 帧、第 3 帧……”;接收端则 “一边收新帧,一边处理已收帧”(类似 CPU 的 “指令流水线”)。
![]()
- 传统流程:发送端(主机)发 “第 1 帧”→ 接收端(从机)收 “第 1 帧”→ 从机处理 “第 1 帧”→ 从机回复 “第 1 帧”→ 主机收回复 → 再发 “第 2 帧”……(每帧之间有大量 “红色空闲时间”)。
-
流水线的实现逻辑:“缓存 + 任务并行”,为实现 “接收” 与 “处理” 并行,需至少两个缓存空间:
![]()
- 当 “缓存 1” 在 “接收新数据帧” 时,“缓存 2” 可同时 “处理已接收的旧数据帧”。
- 发送端也可 “不等接收端回复完” 就发下一帧,只要 “帧间隔” 能让接收端 “正常触发中断、处理数据”。
若需更高效,还可通过队列管理多缓存(如在 μC/OS - II 等实时系统中,用 “内存管理 + 队列服务” 管理多个缓存),甚至支持 “紧急任务插队”(将紧急通信任务插入队列头部优先处理)。









浙公网安备 33010602011771号