串口波特率计算器
常用波特率 · 时钟分频 · 误差计算(UART / USART)
常用波特率/时钟分频/误差
常用波特率 · 时钟分频 · 误差计算(UART / USART)
| 用途 | 波特率 | 位时间 |
|---|---|---|
| 慢速通信 / 早期单片机 | 9600 | 104.17 μs |
| 常见调试 | 19200 | 52.08 μs |
| 常见调试 | 38400 | 26.04 μs |
| 常见调试 | 57600 | 17.36 μs |
| 最常用 | 115200 | 8.68 μs |
| 高速 | 230400 | 4.34 μs |
| STM32 高速 | 460800 | 2.17 μs |
| STM32 高速 | 921600 | 1.09 μs |
| 蓝牙 / USB-Serial | 1500000 | 0.67 μs |
| USB CDC ACM | 3000000 | 0.33 μs |
了解工具定位 · 使用场景 · 对比优势
嵌入式开发者在配置 STM32 串口时,需根据系统时钟频率(如 72MHz)计算分频系数,使实际波特率接近目标值(如 115200)。本工具输入主频和目标波特率,直接输出可选分频值、实际波特率及误差百分比,避免手动计算分频导致的通信丢帧或误码。
GPS 模块(如 NEO-6M)默认输出 9600 波特率,但部分应用需提升至 115200 以降低延迟。调试时需确认模块是否支持该速率,且 MCU 端分频误差是否在 ±2% 以内。本工具快速验证不同分频下的误差,帮助判断是否需要调整系统时钟或改用外部晶振。
工业现场常遇到 10 年前 PLC 或传感器固定使用非标波特率(如 19200、38400),新 MCU 按标准分频后误差可能超标。本工具输入非标目标值,列出所有可行分频组合及误差,让工程师快速找到最接近的可用配置,避免因波特率不匹配导致通信失败。
当波特率超过 1Mbps(如 2M、3M),晶振微小偏差就会导致误码。本工具支持输入任意目标波特率,自动计算各分频下的误差,并标注误差 ≤ 0.5% 的推荐分频值。硬件工程师据此选择分频,再配合示波器验证眼图,确保高速通信的可靠性。
选型阶段比较不同 MCU 的串口性能时,需知道某芯片在常用波特率(如 115200、921600)下能达到的最小误差。本工具输入芯片典型主频(如 16MHz、48MHz),输出各波特率对应的误差列表,帮助对比不同芯片的串口精度,避免选型后才发现误差超标。
| 维度 | 本工具 | 竞品 A (在线波特率计算器) | 传统方法 (手册查表/手动计算) |
|---|---|---|---|
| 数据隐私 | 纯浏览器端计算,数据不上传服务器 | 数据需提交至服务器端处理 | 完全离线,无数据泄露风险 |
| 处理速度 | 即时计算,毫秒级响应 | 受网络延迟影响,通常 1-3 秒 | 依赖人工查表或公式计算,耗时数分钟 |
| 离线可用 | 支持,计算逻辑在浏览器本地运行 | 不支持,必须联网 | 支持,但需携带手册或计算器 |
| 计算误差 | 提供精确计算结果,可指定小数位数 | 精度取决于后端算法,通常固定 | 人工计算易产生四舍五入或抄录错误 |
| 使用门槛 | 打开网页即用,无需安装或学习 | 需访问特定网站,操作步骤较多 | 需理解波特率、分频系数等专业概念,门槛高 |
| 适用场景 | 嵌入式开发、硬件调试时的快速验证 | 临时性、非频繁的在线查询 | 教学演示、对计算过程有严格追溯要求的场景 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 9600 | 波特率: 9600 | 时钟分频: 125 (16MHz) | 误差: 0.00% | 典型常规场景:最常用的标准波特率之一 |
| 115200 | 波特率: 115200 | 时钟分频: 10.42 (16MHz) | 误差: -0.08% | 典型常规场景:高速串口通信常用值 |
| 300 | 波特率: 300 | 时钟分频: 4000 (16MHz) | 误差: 0.00% | 边界 case:极低波特率,分频值很大 |
| 921600 | 波特率: 921600 | 时钟分频: 1.30 (16MHz) | 误差: 0.16% | 边界 case:超高波特率,分频接近整数下限 |
| 14400 | 波特率: 14400 | 时钟分频: 83.33 (16MHz) | 误差: 0.00% | 易错 case:非标准值(非 2 的幂倍数),实际可用 |
| 19200 | 波特率: 19200 | 时钟分频: 62.50 (16MHz) | 误差: 0.00% | 典型常规场景:工业现场总线常用值 |
| 250000 | 波特率: 250000 | 时钟分频: 4.80 (16MHz) | 误差: 0.00% | 边界 case:CAN 总线常用波特率,非串口标准值 |
115200.0115200波特率是整数,小数部分无意义。工具输入框只接受正整数,输入小数会导致解析失败或结果异常。
115200 bps = 115200 字节/秒115200 bps = 115200 位/秒 = 14400 字节/秒(8N1 格式下)串口一帧含起始位、数据位、校验位、停止位,实际有效字节率 = 波特率 × (数据位/总位数)。直接按 1:1 算字节会高估。
选 115200,但 MCU 晶振是 12MHz选 115200 前先用工具计算该晶振下的实际误差(如 12MHz 下 115200 误差约 8.5% 不可用)标准波特率需要特定晶振才能整数分频。晶振不匹配时实际波特率偏差超 2% 会导致通信误码。工具应配合晶振输入计算误差。
设置 115200 波特率,2 个停止位,以为速率不变设置 115200 波特率,2 个停止位时实际位率 = 115200 × (8+1+2) / (8+1+1) = 103680 bps停止位增加会降低有效数据速率。工具计算有效吞吐时需考虑帧格式(数据位+校验位+停止位)。
输入 16(分频值)输入 115200(目标波特率),工具自动计算分频值工具输入是目标波特率,不是分频系数。分频系数 = 晶振频率 / (16 × 目标波特率)。输入分频值会导致结果完全错误。
8N1 和 8E1 用同一个波特率计算有效数据率8N1:10 位/帧;8E1:11 位/帧。相同波特率下 8E1 有效字节率低 10%校验位占用一个位时间,不携带数据。工具应允许选择校验模式,否则有效吞吐计算会偏差。
工具显示误差 0.16%,认为通信一定可靠误差 0.16% 是理论值,实际还需考虑晶振温漂、线缆电容、接收端采样容差工具计算的是分频整数舍入误差。实际系统中晶振本身有 ±50ppm 温漂,加上线缆延迟,总误差可能翻倍。
公式推导 · 流程图解 · 依据出处
Baud = F_clk / (16 × (UBRR + 1))
Baud — 目标波特率(bps)F_clk — 系统时钟频率(Hz)UBRR — 波特率寄存器值(整数 0-65535)AVR 单片机 F_clk = 16 MHz,目标波特率 9600 bps。代入公式:9600 = 16,000,000 / (16 × (UBRR + 1)) → UBRR + 1 = 16,000,000 / (16 × 9600) ≈ 104.1667 → UBRR = 103。实际波特率 = 16,000,000 / (16 × 104) ≈ 9615 bps,误差 0.16%。
适用于 AVR 系列单片机(如 ATmega328P)异步 USART 模式。不适用于同步模式或非标准时钟分频架构。公式来源:Atmel/Microchip AVR 数据手册 USART 章节。
3 种主流语言 · 复制即用
import math
# 计算给定波特率下的时钟分频值和误差
baud = 9600 # 目标波特率
f_osc = 16_000_000 # 晶振频率 16 MHz
# 常用 UART 时钟分频公式:BR = f_osc / (16 * divisor)
divisor = f_osc / (16 * baud)
div_int = round(divisor)
actual_baud = f_osc / (16 * div_int)
error = abs(actual_baud - baud) / baud * 100
print(f"理想分频: {divisor:.2f}")
print(f"取整分频: {div_int}")
print(f"实际波特率: {actual_baud:.0f}")
print(f"误差: {error:.2f}%")package main
import (
"fmt"
"math"
)
func main() {
baud := 9600.0
fOsc := 16_000_000.0
// 计算分频系数(16倍过采样)
divisor := fOsc / (16 * baud)
divInt := math.Round(divisor)
actualBaud := fOsc / (16 * divInt)
error := math.Abs(actualBaud-baud) / baud * 100
fmt.Printf("理想分频: %.2f\n", divisor)
fmt.Printf("取整分频: %.0f\n", divInt)
fmt.Printf("实际波特率: %.0f\n", actualBaud)
fmt.Printf("误差: %.2f%%\n", error)
}// 计算波特率分频与误差
const baud = 9600;
const fOsc = 16_000_000;
const divisor = fOsc / (16 * baud);
const divInt = Math.round(divisor);
const actualBaud = fOsc / (16 * divInt);
const error = Math.abs(actualBaud - baud) / baud * 100;
console.log(`理想分频: ${divisor.toFixed(2)}`);
console.log(`取整分频: ${divInt}`);
console.log(`实际波特率: ${actualBaud.toFixed(0)}`);
console.log(`误差: ${error.toFixed(2)}%`);8 个高频疑问
「硬件 / 嵌入」下的其他工具