0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

串口波特率误差产生的原因

CHANBAEK 来源:硬件工程师技术干货 作者:硬件工程师技术干 2023-04-13 16:20 次阅读

1、UART接口

UART全称Universal Asynchronous Receiver/Transmitter,通用异步收发器,是一种非常常见的异步收发协议,在嵌入式领域应用十分广泛。收发双方按照约定好通讯波特率进行配置,如果波特率不匹配会导致失败。

2、分频与波特率

使用单片机的朋友,经常使用4800、9600、38400、115200等波特率。设计电路时经常采用11.0592Mhz这样“不规则”晶振,看起来不规则,实际上很规则,原因是可以精确分频成常用波特率。

11.0592MHz=11059200=115200*96

11.0592MHz=11059200=57600*192

11.0592MHz=11059200=19200*576

有细心的朋友经常采用11.0592Mhz晶体设计电路,调试完串口通讯之后更换为12MHz后单片机依然能够正常通讯,并没有出现通讯异常。可见波特率有少许误差也是能够容忍的。

3、串口如何采样

串口接收方,在收到起始位后,延时1.5个位周期进行第1位采样,然后依次隔一个位周期采样一位,直至把所有数据位采样完成。如果接收方采样位置正好在数据位的中间位置,那么采样非常完美,不会出现问题。以下是8bit串口通讯数据格式示意图。

注意,这里的采样并不是只采样一次,有些芯片会采样多次,这里仅做示意。

4、误差原因

如果接收方位周期略微大于发送方位周期,就会出现下图所示的情况。采样位置逐渐偏移数据位中心,bit7采样位置偏移最严重。这就是波特率误差。采样点移位过多就会导致位错误,导致通讯失败。当然如果接收方位周期略微小于发送方位周期,也是同样道理。一般测特率误差2%-3%是没有问题的。

5、举例

笔者正在使用的某款cortex-M3内核芯片,需求的波特率是460800bps。串口时钟频率是36MHz。此款芯片波特率配置方法是串口时钟频率除以16,再除以分频因子。计算出分频因子(分频因子只能是整数),然后写入相应寄存器即可。算来算去,无论如何计算都不能准确分频出460800bps。按照如下代码计算出的分频因子是4。然后反推出波特率是562500bps,整除失去了小数位,导致差距巨大,根本无法通讯。

// baud rate = (serial clock freq) / (16 * divisor).
  tmpBaudRateDiv = (clocks.PCLK_Frequency / 16) / UART_InitStruct->UART_BaudRate;

于是乎做了个优化,如下代码,计算出的分频因子是5。然后反推出波特率是450,000bps,差距比较小,测试了一下通讯性能没问题。

// baud rate = (serial clock freq) / (16 * divisor).
  tmpBaudRateDiv = ((clocks.PCLK_Frequency / 16) + UART_InitStruct->UART_BaudRate / 2) / UART_InitStruct->UART_BaudRate;

6、不建议串口高速使用

串口毕竟是一个低速的数据传输协议,这种异步传输,没有时钟同步信号,在传输的每个字节中采样有误差积累,不建议高速使用,笔者使用过几种高波特率460800、921600、1500000等。原因是低端的单片机主频速率较低,处理高速数据流效率低下,如需高速使用,可根据自己需求开启串口FIFO、串口DMA、串口流控等。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19008

    浏览量

    302956
  • 晶振
    +关注

    关注

    33

    文章

    2819

    浏览量

    67889
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76160
  • uart
    +关注

    关注

    22

    文章

    1227

    浏览量

    101161
  • 波特率
    +关注

    关注

    2

    文章

    294

    浏览量

    34060
收藏 人收藏

    评论

    相关推荐

    STM32串口波特率大小计算案例

    波特率的计算 STM32下的波特率串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有个波特率寄存器USART_BRR
    的头像 发表于 10-23 14:19 8192次阅读
    STM32<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>大小计算案例

    什么是串口波特率串口波特率的分类及应用详解

    什么是串口波特率串口波特率是指串口通信系统中传输数据的速率。在UART串口通信中,数据以位(bi
    的头像 发表于 08-08 10:09 5751次阅读
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>的分类及应用详解

    串口波特率计算工具下载

    串口波特率计算工具
    发表于 03-11 09:38 179次下载

    C Core芯片SCI串口波特率容限优化

    发现了C*Core国芯芯片中SCI发送与接受方波特率误差导致数据不匹配问题,分析了发送与接受方数据传输丢帧、误帧现象出现的根本原因,总结了SCI容限值与芯片主频及标准波特率之间规
    发表于 03-05 17:45 17次下载
    C Core芯片SCI<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>容限优化

    串行通信的实现条件和波特率自动整定问题

    串行通信在波特率误差超过一定范围时,会产生错误。本节介绍的内容在51单片机上仅用软件就实现了波特率自动整定,最大程度地减小了波特率
    发表于 03-23 14:52 3846次阅读
    串行通信的实现条件和<b class='flag-5'>波特率</b>自动整定问题

    STM32的串口自动识别波特率

    STM32串口自动识别波特率
    的头像 发表于 03-04 09:53 9387次阅读

    串口通讯实际的波特率测量

    平时使用串口打印出现乱码的绝大部分原因串口波特率没对。那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下
    的头像 发表于 04-04 17:27 7083次阅读
    <b class='flag-5'>串口</b>通讯实际的<b class='flag-5'>波特率</b>测量

    串口波特率计算详解

    STM32下波特率计算详解波特率的计算    STM32下的波特率串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有
    发表于 12-05 09:06 22次下载
    <b class='flag-5'>串口</b><b class='flag-5'>波特率</b>计算详解

    串口通讯波特率出现误差的因素

    串口通讯(UART)是一种异步通讯,收发双方需要按照约定的波特率进行通讯。当波特率出现误差时,会导致通讯出错。那导致波特率出现
    的头像 发表于 07-03 17:40 9910次阅读

    波特率是什么?波特率设计

    从宏观理解,波特率表征了串口的传输速度。
    的头像 发表于 06-05 15:19 2.6w次阅读
    <b class='flag-5'>波特率</b>是什么?<b class='flag-5'>波特率</b>设计

    什么是波特率?为什么要设置波特率

    欢迎来到东用知识小课堂!一、什么是波特率波特率(BaudRate)单位bps是用于衡量串口通信速度的单位,它表示每秒钟发送的比特数。如果一个串口
    的头像 发表于 04-08 00:00 6650次阅读
    什么是<b class='flag-5'>波特率</b>?为什么要设置<b class='flag-5'>波特率</b>?

    串口传输速率低于波特率怎么办 串口通信的波特率如何设置

    如果串口传输速率低于波特率,您可以尝试以下方法来解决问题:   1. 检查硬件连接:确保串口连接正确且牢固。检查连接线是否完好,确保没有松动或断开的接触。   2. 检查波特率设置
    的头像 发表于 09-08 16:23 5966次阅读

    什么是串口波特率串口通信为什么要设置波特率

    在电子设备的世界中,数据是通过各种方式进行传输的。其中,串口通信是一种常见的数据传输方式,它以其简单、可靠和广泛的特性,成为了电子设备间通信的重要手段。而在串口通信中,有一个非常重要的参数——波特率
    的头像 发表于 11-03 08:21 4763次阅读
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b>通信为什么要设置<b class='flag-5'>波特率</b>?

    什么是串口波特率串口通信为什么要设置波特率

    什么是串口波特率串口通信为什么要设置波特率波特率与比特的关系 如何选择
    的头像 发表于 01-22 16:10 1955次阅读

    如何使用示波器测量串口波特率

    在通信和电子测量领域,串口波特率是一个至关重要的参数,它决定了数据在串行通信线上的传输速率。使用示波器来测量串口波特率是一种常见且有效的方法,尤其是在没有专业
    的头像 发表于 05-27 16:25 4394次阅读