UART传输时间怎么算?从115200、8N1到7位数据模式

2 阅读3分钟

串口设置为 115200 baud 后,发送一段数据到底需要多久?为什么不能简单地用“数据量除以波特率”得到答案?关键在于区分波特率、线路位数和数据吞吐率。

计算模型

本文把发送数量定义为 UART 数据帧数量,不是汉字数量、Unicode 字符数量或任意字符串长度。计算模型如下:

frameBits   = 1 + dataBits + parityBits + stopBits
totalBits   = frameCount × frameBits
payloadBits = frameCount × dataBits
timeSeconds = totalBits ÷ baudRate

发送帧数大于 0 时:

payloadBitRate = payloadBits ÷ timeSeconds

payloadBits 只统计 UART 数据字段,不扣除应用层协议头、转义、校验、缓冲或重传,因此不是应用层实测速率。以下计算假设帧连续发送、没有主动插入帧间空隙;驱动、DMA/FIFO、USB 转换器、流控和调度可能让实际经过时间更长。

Microchip 官方 USART 资料将 8N1 解释为 1 个起始位、8 个数据位、无校验位和 1 个停止位,所以每帧占用 10 个线路位。具体芯片的特殊模式仍应以对应数据手册为准。

三个算例

配置每帧线路位数线路总位数数据字段位数理论时间数据字段吞吐率
115200、8N1、100 帧10 bit1000 bit800 bit8.68056 ms92160 bit/s
9600、7N1、100 帧9 bit900 bit700 bit93.75 ms7466.67 bit/s
115200、9N1、100 帧11 bit1100 bit900 bit9.54861 ms94254.55 bit/s

115200 baud、8N1、100 帧

  1. frameBits = 1 + 8 + 0 + 1 = 10 bit/frame
  2. totalBits = 100 × 10 = 1000 bit
  3. payloadBits = 100 × 8 = 800 bit
  4. timeSeconds = 1000 ÷ 115200 = 0.0086805556 s ≈ 8.68056 ms
  5. payloadBitRate = 800 ÷ 0.0086805556 = 92160 bit/s

115200 是线路比特率,不是 115200 字节/秒。对于这个 8 位数据例子,92160 bit/s 可以换算为 11520 B/s,但这只是单位换算,不代表所有 UART 模式都传输 8 位字节。

9600 baud、7N1、100 帧

frameBits = 1 + 7 + 0 + 1 = 9 bit/frame;线路总量为 100 × 9 = 900 bit;数据字段为 100 × 7 = 700 bit;时间为 900 ÷ 9600 = 93.75 ms;数据字段吞吐率约为 7466.67 bit/s

7 位模式下,一帧不是一个 8 位数据字节。如果上层有任意 8 位字节流,必须另行定义打包或编码;本文模型不自动假设这种转换。

115200 baud、9N1、100 帧

frameBits = 1 + 9 + 0 + 1 = 11 bit/frame;线路总量为 1100 bit;数据字段为 900 bit;时间约 9.54861 ms;数据字段吞吐率约 94254.55 bit/s。9 位数据字段同样不定义上层字节流的打包方式。

常见错误和适用限制

  • 只计算“数据位 ÷ 波特率”,会漏掉起始位、校验位和停止位。
  • 把 baud/s 直接当成字节每秒;应先确定数据位数和帧格式。
  • 把 Unicode 字符数当作 UART 帧数;编码后的字节数属于更高一层的问题。
  • 把连续线路时间当成端到端实测延迟;软件等待、流控、缓冲和帧间空隙都可能增加耗时。
  • 零帧是合法边界:每帧位数仍由格式决定,但线路总位数、数据字段位数、时间和吞吐率均为 0,不会出现除零结果。

我维护的中文 UART 传输时间计算器可以帮助复核不同帧格式的算术,但它只是理论计算辅助工具,不能替代目标芯片手册、串口分析仪或实际链路测试。

参考资料: