什么是波特率,波特率怎么计算

✍ 什么是波特率,波特率怎么计算➹

更多硬件知识,请持续关注公众号【数字硬鉴】

概述:
  ☆简而言之,串口传输的波特率即为每秒钟传输二进制的位数。
  ☆脱离枯燥乏味的文字描述,我们用波形和数字来看看波特率是什么吧☟。
  ☆说明:系统时钟50M(为串口提供时钟的时钟频率),波特率115200。
  
基础知识:

系统时钟(为串口提供时钟的时钟频率)-50M时钟周期150∗106{{\rm{1}} \over {{\rm{50*1}}{{\rm{0}}^{\rm{6}}}}}501061
1个时钟周期可以计数1次50M时钟1s计数50 000 000个
系统时钟-50M计1个数需要150∗106{{\rm{1}} \over {{\rm{50*1}}{{\rm{0}}^{\rm{6}}}}}501061s
波特率-1152001s传输二进制的位数115200bit
波特率-115200传输1bit需要 1/115200s=8.68us
50M系统时钟------波特率为115200传输1bit需要计数(50∗106/115200)=434({\rm{50*1}}{{\rm{0}}^{\rm{6}}}/{\rm{115200}}) = 434(50106/115200)=434
以上重点是推导出50M系统时钟—波特率为115200条件下传输1bit需要计数个数为434。

串口传输格式
●我们通常用的串口传输格式为:1bit起始位+8bit数据位+1bit停止位(无奇偶校验位),如下图所示:
在这里插入图片描述
所以传输1Byte数据串口需要传输10bit数据。上面计算得传输1Bit需要的时间为8.68us,则传输1Byte需要时间为8.68*10=86.8us。

波特率
  由基础知识知50M系统时钟—波特率为115200条件下传输1bit需要计数个数为434。那么1Byte(串口传输格式为:1bit起始位+8bit数据位+1bit停止位)是不是循环计数10次434就可以传输完毕。
直接上图:图中描述了1Byte数据传输的示意图,重点都在图里!!!。
在这里插入图片描述
✍什么时候去采样串口线上的数据呢?
  ★观察上图,Buad_Flag信号(通道2)表示了传输1Bit传输的间隔,每遇到1个Buad_Flag=1的信号,数据线上切换1次数据,所以两个Buad_Flag=1之间的数据是稳定的数据,根据抽样定理是不是应该在两个Buad_Flag=1信号的中间去采样数据呢,其实就是在1bit数据持续期间的中间点采样,才能得到最稳定的数据。见下图,重点都在图里!!!
  在这里插入图片描述
  ★图中序号①-⑩分别为10bit数据的采样点,采样点处提取数据为0101_0101(0x55),低位在前。

★★★至此,从下往上再看一遍,就明白了我们所熟悉的波特率(115200/9600/…)怎么来的。
☞然后再想想为什么51单片机会有一个定时器专门服务于串口。
☞再想想为什么9600波特率和115200波特率不能对接了,原理很简单我这边2秒发一次数据,你那边1秒接一次数据,怎么能成功接收呢。

收发波特率一致:
在这里插入图片描述
收发波特率不一致,导致RX端不能正常接收:
在这里插入图片描述

★★★如有错误,欢迎指导。

### 波特率的概念与串口通信中的应用 波特率是衡量数据传输速度的重要指标之一,通常用于描述串行通信中信号的传输速率。波特率表示单位时间内传送的码元符号个数(即每秒传输的信号变化次数)。在串口通信中,波特率决定了发送和接收设备之间的同步频率[^1]。 在串口通信中,波特率的设定直接影响数据传输的稳定性与准确性。例如,在51单片机的串口通信中,波特率由定时器或波特率发生器决定,并通过配置寄存器来实现。常见的波特率包括9600、19200、38400、57600和115200等[^1]。 #### 波特率计算方法 波特率计算与系统时钟频率密切相关。以下为基于不同硬件平台的波特率计算示例: - **51单片机波特率计算** 在51单片机中,波特率可以通过定时器T1的溢出中断来实现。假设系统时钟为11.0592MHz,使用模式1(8位UART),则波特率计算公式为: \[ 波特率 = \frac{振荡频率}{12 \times (256 - 定时初值)} \] 根据此公式,可以计算出对应于不同波特率的定时初值。例如,当目标波特率为9600时,定时初值约为253[^1]。 - **STM32波特率计算** STM32采用更灵活的分数波特率发生器,允许用户通过配置USART_BRR寄存器实现精确的波特率设置。其计算公式为: \[ USARTDIV = \frac{f_{CK}}{波特率} \] 其中,\( f_{CK} \) 是时钟源频率。例如,若时钟源为72MHz,目标波特率为115200,则 \( USARTDIV = 625 \)[^2]。 #### 编程实现串口通信 以下是基于51单片机和STM32的串口通信代码示例: - **51单片机串口初始化代码** ```c #include <reg52.h> void UART_Init() { TMOD = 0x20; // 设置T1为模式2 TH1 = 0xFD; // 波特率初值,对应9600bps SCON = 0x50; // 8位数据,1位停止位,允许接收 TR1 = 1; // 启动T1 } void main() { UART_Init(); while (1) { TI = 0; // 清除发送标志 SBUF = 'A'; // 发送字符'A' while (!TI); // 等待发送完成 } } ``` - **STM32串口初始化代码** ```c #include "stm32f10x.h" void UART_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStruct); USART_Cmd(USART1, ENABLE); } int main() { UART_Init(); while (1) { USART_SendData(USART1, 'B'); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } ``` ### 注意事项 在实际应用中,需确保发送端与接收端的波特率一致,否则可能导致数据传输错误。此外,选择合适的波特率还需考虑系统时钟精度及外部噪声干扰等因素[^3]。
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字硬鉴

你的鼓励就是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值