没人教你的串口技巧:3 个冷门概念,让通信效率直接翻倍

1.串口流控

“流” 指 “数据流”。当收发双方​速率不匹配​(如接收端处理速度慢于发送端),接收端缓冲区会 “溢出”,导致数据丢失。“流控” 的核心是 “让发送端根据接收端状态,动态调整发送行为”。

  • ​硬件流控:​通过专用引脚信号控制,最常用的是 RTS​/CTS(请求发送 / 清除发送) 流控,原理是 “接收端用 CTS 告诉发送端‘是否能发’,发送端用 RTS 请求‘能否发’”。
    • 常见信号定义如下​:

      • RTS(Request To Send):发送端向接收端请求 “允许发送”(如 MCU 给 “串口模组” 发 RTS 低电平,表示 “我准备好收了,你可以发”)。
      • CTS(Clear To Send):接收端向发送端回应 “允许发送”(如 “串口模组” 给 MCUCTS 低电平,表示 “我准备好发了,你可以收”)。
    • 工作逻辑​:接收端会设置 “缓冲区高位(如缓存占比 75%)” 和 “缓冲区低位(如缓存占比 25%)”:

      • 当接收端缓存 “≥ 高位”,就把 RTS​ 置为高电平(表示 “我缓存快满了,别发了”);发送端检测到 RTS 高电平,就停止发送。
      • 当接收端缓存 “≤ 低位”,就把 RTS​ 置为低电平表示 “我缓存有空了,继续发”);发送端检测到 RTS 低电平,就恢复发送。
    • ​注:​硬件流控需 “通信双方硬件支持 RTS/CTS 引脚”,且接线时要 “交叉连接”(如 MCURTS 连串口模组的 CTSMCUCTS 连串口模组的 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” 在 “接收新数据帧” 时,“缓存 2” 可同时 “处理已接收的旧数据帧”。
    • 发送端也可 “不等接收端回复完” 就发下一帧,只要 “帧间隔” 能让接收端 “正常触发中断、处理数据”。

若需更高效,还可通过​队列管理多缓存​(如在 μC/OS - II 等实时系统中,用 “​内存管理 + 队列服务​” 管理多个缓存),甚至支持 “​紧急任务插队​”(将紧急通信任务插入队列头部优先处理)。


posted @ 2026-08-31 11:33  FreakStudio  阅读(18)  评论(0)    收藏  举报