串口设置为 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 bit | 1000 bit | 800 bit | 8.68056 ms | 92160 bit/s |
| 9600、7N1、100 帧 | 9 bit | 900 bit | 700 bit | 93.75 ms | 7466.67 bit/s |
| 115200、9N1、100 帧 | 11 bit | 1100 bit | 900 bit | 9.54861 ms | 94254.55 bit/s |
115200 baud、8N1、100 帧
frameBits = 1 + 8 + 0 + 1 = 10 bit/frame。totalBits = 100 × 10 = 1000 bit。payloadBits = 100 × 8 = 800 bit。timeSeconds = 1000 ÷ 115200 = 0.0086805556 s ≈ 8.68056 ms。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 传输时间计算器可以帮助复核不同帧格式的算术,但它只是理论计算辅助工具,不能替代目标芯片手册、串口分析仪或实际链路测试。
参考资料: