开发者工具 · 硬件 / 嵌入

串口波特率

常用波特率/时钟分频/误差

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 111 次使用
时钟分频 · 实际波特率 · 误差(UART / USART)· 通用 / AVR UBRR / STM32 · 全本地
时钟频率 Foscclock (Hz)
目标波特率baud rate
采样过采样 Moversampling
分频值 Ndivisor
—
实际波特率actual
—
误差error
—
常用波特率 · 当前时钟@ 16 MHz · 通用分频 · 16x
目标波特率分频值(十进制)十六进制实际波特率误差 %
误差 ≤ 2% · 通信可靠 误差 > 2% · 可能误码 分频值为整数,实际波特率由整数分频反算;误差 = (实际 − 目标) / 目标
第一节

关于本工具

About

调试一块 STM32 板子,波特率设 115200,串口助手却吐出乱码——时钟源分频系数算错一位,实际波特率偏了 8%。这个工具接收目标波特率和时钟频率,直接算出最接近的整数分频系数、实际波特率与相对误差,并列出所有常用波特率对应的可行配置。计算全程在浏览器内完成,无数据上传。

使用场景

壹

STM32时钟配置

嵌入式开发者在做STM32F103串口通信时,需要将系统时钟72MHz分频到115200bps。手算发现分频系数不是整数,实际波特率误差0.16%,可能导致高波特率下丢包。用本工具直接输入目标波特率和时钟频率,自动算出最接近的分频系数和误差百分比,避免因分频误差导致通信不稳定。

贰

老设备波特率匹配

工厂里一台2003年的PLC串口模块标签磨损,只余模糊的“9600”字样。上位机软件默认使用9600bps连接失败,怀疑实际是19200bps或4800bps。用本工具枚举常见波特率对应的分频系数和误差范围,对照示波器实测的位宽,快速锁定实际波特率为9600bps,恢复产线数据采集。

叁

FPGA UART核调试

在Xilinx Artix-7上实现自定义UART IP核,系统时钟50MHz,需要支持921600bps高速传输。Verilog代码中波特率发生器计数器值需精确计算,手算结果导致实测误差达2.1%,通信不可靠。用本工具输入50MHz和921600bps,得到推荐分频值54,误差仅0.03%,修改代码后串口收发稳定。

肆

无线串口模块配对

两个HC-12无线串口模块需要配对通信,但一个模块的默认波特率被前用户改成了57600bps,另一个是出厂默认9600bps。不知道哪个模块是哪个波特率,盲猜会反复失败。用本工具列出模块支持的所有常用波特率,配合串口调试助手逐一测试,发现57600bps模块在8MHz晶振下误差最小,完成配对。

伍

Bootloader波特率协商

设备升级固件时,Bootloader默认用115200bps与上位机握手,但部分老旧工控机串口芯片不支持该速率,只能跑38400bps。需要计算38400bps在16MHz晶振下的分频误差,确保误差<0.5%才能稳定下载。用本工具快速验证38400bps的误差为0.16%,确认可用,避免升级中途卡死变砖。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「时钟频率」输入框键入晶振值(如 11.0592 MHz),波特率列表自动刷新
  2. 2在「目标波特率」下拉框选择一个常用值(如 9600),表格高亮匹配行
  3. 3查看「分频系数」列显示的实际分频值,确认是否在整数范围内
  4. 4检查「误差」列百分比,低于 0.5% 的行标记为绿色,高于 2% 标记为红色
  5. 5点击表格任意行,右侧「配置摘要」区显示该波特率的完整寄存器设置值

输入输出示例

输入输出说明
9600(波特率值)常用波特率:9600;时钟分频(16MHz):1667;误差:0.0%常规:最经典的串口波特率,验证工具对标准值的识别和分频计算准确性
115200(波特率值)常用波特率:115200;时钟分频(16MHz):139;误差:0.0%常规:高速串口常用值,验证工具对高波特率的分频计算是否精确
2400(波特率值)常用波特率:2400;时钟分频(16MHz):6667;误差:0.0%常规:低速串口标准值,验证工具对低频分频的整数处理
1(波特率值)常用波特率:1;时钟分频(16MHz):16000000;误差:0.0%边界:极低波特率,验证工具对超高分频值的正确处理(不溢出或截断)
4000000(波特率值)常用波特率:4000000;时钟分频(16MHz):4;误差:0.0%边界:极高波特率(接近时钟上限),验证工具对最小分频值的处理
14400(波特率值)常用波特率:14400;时钟分频(16MHz):1111;误差:0.0%易错:非标准波特率(非 2 的幂次倍数),验证工具是否仍能正确计算分频和误差
38400(波特率值)常用波特率:38400;时钟分频(16MHz):417;误差:0.0%易错:部分工具将 38400 误判为 38400 与 16MHz 分频不整除,实际 16MHz/38400/16=26.0417 非整数,验证工具是否报告误差

常见错误对照

1.误将十进制波特率当成分频系数写入寄存器

✗ 错误想得到 115200 bps,直接给 UART 分频寄存器写 115200
✓ 修复根据时钟频率计算分频系数:例如 16 MHz 时钟下,115200 对应的分频系数为 16e6 / (16 × 115200) ≈ 8.68,取整后写入 8 或 9

UART 波特率生成器需要的是时钟分频系数(整数),不是波特率数值。分频系数 = 时钟频率 / (过采样率 × 目标波特率),过采样率通常为 16。

2.忽略过采样率(Oversampling)对波特率计算的影响

✗ 错误使用公式 时钟频率 / 目标波特率 直接计算分频值
✓ 修复使用完整公式:分频值 = 时钟频率 / (过采样率 × 目标波特率),过采样率通常为 16(USART)或 8(高速模式)

UART 内部会以过采样率倍数采样位宽,忽略过采样率会导致分频值偏大,实际波特率偏低。STM32 等 MCU 的 USART 过采样率可在 8 和 16 之间选择。

3.未考虑非标准晶振频率导致的波特率误差

✗ 错误在 11.0592 MHz 晶振下直接使用 8 MHz 示例代码的 115200 分频值
✓ 修复重新计算:11.0592e6 / (16 × 115200) = 6.0,分频值写 6;若晶振为 12 MHz,则 12e6 / (16 × 115200) ≈ 6.51,取整后实际波特率误差约 0.16%

波特率误差 = |实际波特率 - 目标波特率| / 目标波特率。分频值取整后,非整数分频会产生误差,误差超过 ±2% 可能导致通信丢帧。常用晶振 11.0592 MHz 是专为 115200 设计的整数分频。

4.混淆逻辑波特率与物理线速率

✗ 错误设置 UART 波特率为 115200,认为每秒传输 115200 字节
✓ 修复115200 bps 表示每秒传输 115200 位(bits),包含起始位、数据位、校验位、停止位。实际有效字节速率 ≈ 115200 / (1 + 8 + 1) = 11520 字节/秒(8N1 格式)

波特率是位速率(bit/s),不是字节速率。每帧包含起始位(1)、数据位(5~9)、校验位(0/1)、停止位(1~2),有效载荷占比约 80%。

5.在高速波特率下忽略线路电容和驱动能力

✗ 错误用 1 米长杜邦线连接两个开发板,设置 921600 bps 通信
✓ 修复高速通信(≥ 921600 bps)使用屏蔽双绞线或 RS-485 差分传输,线长控制在 30 cm 以内;或降低波特率至 115200 以下

UART 是异步串行,对信号上升沿敏感。长线电容和寄生电感会滤除高频分量,导致位宽畸变、采样错误。RS-232 标准推荐 115200 下最大线长约 15 米,但实际受线材和驱动芯片影响。

6.误以为所有 UART 外设都支持任意波特率

✗ 错误在 AVR 单片机上设置 250000 bps,期望正常工作
✓ 修复查阅数据手册支持的波特率列表,或使用公式验证分频值是否为整数;常见 MCU 的 UART 仅支持特定分频值(如 2^n 或整数分频)

部分 MCU 的 UART 分频器只能取 2 的幂次或有限整数,非整数分频会被截断,导致实际波特率偏差过大。AVR 的 USART 分频值范围 1~65535,但必须满足误差 < 2%。

7.忽略波特率自动检测(Auto-baud)的初始条件

✗ 错误在支持自动波特率的设备上,发送第一个字节 0x55 后立即发送数据
✓ 修复先发送同步字节 0x55(二进制 01010101,提供稳定边沿),等待设备锁定波特率后再发送正式数据

自动波特率检测依赖接收到的第一个字节的位宽来推算速率。0x55 提供交替的 0/1 边沿,是最可靠的同步模式。若第一个字节为 0x00 或 0xFF,边沿过少,检测可能失败。

第三节

工作原理

How It Works

核心公式

实际波特率 = 系统时钟频率 ÷ (16 × (USARTDIV + 0.5 × FRACTION))

变量说明

  • 系统时钟频率MCU 主频,单位 Hz
  • USARTDIV波特率分频系数整数部分
  • FRACTION分频系数小数部分,0 或 1

示例

STM32F103 系统时钟 72 MHz,目标波特率 115200。计算 USARTDIV = 72000000 ÷ (16 × 115200) = 39.0625,取整数 39,小数 0.0625 四舍五入为 0。实际波特率 = 72000000 ÷ (16 × (39 + 0.5 × 0)) = 72000000 ÷ 624 = 115384.6 bps,误差 (115384.6 - 115200) ÷ 115200 ≈ 0.16%,在 ±2% 允许范围内。

输入目标波特率查表匹配时钟分频 & 误差计算实际波特率( 时钟源 / 分频系数 )输出误差分析推荐分频系数常用波特率列表
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
问这个波特率计算器里面的误差是怎么算出来的?准不准?+
答

误差计算公式是:(实际波特率 - 目标波特率) / 目标波特率 × 100%。实际波特率 = 时钟频率 / (16 × 分频系数),分频系数由芯片的 UART 寄存器设置决定。工具假设时钟源是整数分频,所以当目标波特率不能整除时钟频率时就会出现误差。误差在 ±2% 以内通常不影响通信,超过 ±3% 就可能出现丢帧。工具给出的误差值就是理论计算值,不是实测值。

问为什么我单片机用 11.0592MHz 晶振,算 9600 波特率没有误差?+
答

因为 11.0592MHz 是专门为串口通信设计的晶振频率。11059200 / 16 / 9600 = 72,正好是整数,分频系数为 72,所以误差为 0%。这也是为什么很多 51 单片机开发板都用这个晶振——它能整除 1200、2400、4800、9600、19200、38400 等常用波特率。换成 12MHz 晶振算 9600,分频系数 78.125,取整后就会有约 0.16% 的误差。

问我该选哪个时钟频率来算?12MHz 还是 11.0592MHz?+
答

取决于实际使用的晶振或内部振荡器频率。如果开发板用的是 11.0592MHz 晶振,就选 11.0592MHz;如果是 STM32 等芯片用内部 HSI(通常是 8MHz 或 16MHz),就选对应值。工具提供了常见晶振频率下拉菜单,也支持手动输入自定义频率。不确定时,查看芯片手册或原理图上的晶振标号。选错频率,算出来的分频系数和误差都是错的。

问算出来的分频系数是小数,单片机里怎么设?+
答

大多数 UART 的分频寄存器只能设整数,所以工具会给出最接近的整数分频系数(四舍五入或向下取整),然后基于这个整数反算实际波特率和误差。部分高端芯片(如 STM32 的 USART)支持小数分频(如 USARTDIV = 78.125),工具在分频系数列会同时标出整数部分和小数部分。使用前先确认芯片是否支持小数分频,否则只能取整。

问这个工具能算 STM32 的 USART 分频吗?和 51 单片机一样吗?+
答

计算原理相同,都是 时钟频率 / (16 × 目标波特率) = 分频系数。但 STM32 的 USART 分频寄存器结构不同:BRR 寄存器高 4 位存小数部分(0~15),低 12 位存整数部分。工具结果区会单独标注 STM32 BRR 值(十六进制)和整数/小数分离写法。51 单片机通常用定时器做波特率发生器,分频公式略有不同(需考虑定时器重装值),工具目前针对的是标准 UART 分频计算。

问我输入的波特率 250000 为什么算出来误差很大?+
答

250000 不是标准波特率(标准系列是 1200/2400/4800/9600/19200/38400/57600/115200/230400/460800/921600),它很难被常见晶振频率整除。例如 16MHz 时钟算 250000:16000000 / 16 / 250000 = 4,分频系数 4 是整数,实际波特率 = 250000,误差为 0%,但这种情况少见。如果时钟是 8MHz,8000000 / 16 / 250000 = 2,整数,误差也为 0%。建议优先使用标准波特率,兼容性更好。

问算出来的误差 0.16% 到底能不能用?会不会丢数据?+
答

0.16% 的误差通常完全可用。串口通信的位采样容限一般在 ±2% 以内(取决于芯片的 UART 模块设计和过采样倍数)。0.16% 远小于 2%,连续传输几百字节也不会出错。但当误差超过 ±2.5% 时,特别是连续传输长帧(如一次发 512 字节),累积的位偏移可能导致最后一个字节的起始位采样出错。如果工具显示误差 > 3%,建议换一个能整除的晶振频率或改用带小数分频的芯片。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭