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、串口流控等。

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

    关注

    5015

    文章

    18482

    浏览量

    292875
  • 晶振
    +关注

    关注

    32

    文章

    2556

    浏览量

    67178
  • 串口
    +关注

    关注

    14

    文章

    1508

    浏览量

    74821
  • uart
    +关注

    关注

    22

    文章

    1164

    浏览量

    100373
  • 波特率
    +关注

    关注

    2

    文章

    284

    浏览量

    33845
收藏 人收藏

    评论

    相关推荐

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

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

    关于串口通信波特率设置的问题

    我之前新建工程的时候在串口设置的波特率为9600,但串口程序在串口调试助手上一直不能连续接收,我想请问一下这个可能是什么原因。 另外我怀疑是
    发表于 07-23 06:05

    请问串口配置的波特率和实际发送的误差能达到多少?

    原子哥,你知不知道STM32串口波特率误差能达到多少啊?
    发表于 05-10 02:40

    8127串口启动 波特率不正常的原因是什么?

    新到8127BCYE1 25ZDK69 使用串口启动模式,测得串口输出波形与之前正常打印CC的板子相同,但波特率不对。请问这是什么原因?根据测试的波形估算
    发表于 08-17 12:16

    怎样去解决串口修改波特率后与目标波特率不匹配的问题呢

    有客户反应,XR系列MCU在修改完串口波特率后,打印输出的是乱码,通过仪器抓波形发现输出的波特率与设置不一致。怎样去解决串口修改波特率后与目
    发表于 12-29 06:43

    怎么测量实际的波特率

    平时使用串口打印出现乱码的绝大部分原因串口波特率没对。那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下
    发表于 01-13 06:47

    串口波特率计算怎么计算

    STM32下波特率计算详解波特率的计算    STM32下的波特率串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有
    发表于 02-08 06:28

    求助,串口波特率总是对不上是为什么?

    情况具体是这样的,系统时钟使用的是默认配置,内部时钟8分频后为12MHZ,波特率设置的是115200,初始化串口1之后一直接收到的是乱码,后来把串口助手的接受波特率改成128000之后
    发表于 05-18 07:14

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

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

    串口波特率计算详解

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

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

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

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

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

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

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

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

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

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

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