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

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

3天内不再提示

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

汽车玩家 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2020-04-04 17:27 次阅读

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

什么是波特率、比特率?

比特率(Bitrate)表示每秒钟传输的二进制位数,单位为比特每秒(bit/s)。

波特率(Baudrate)表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。

码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

常见的通讯传输中,用 0V 表示数字 0, 5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致。

如果在通讯传输中,有 0V、2V、 4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。因为很多常见的通讯(比如串口通讯)中一个码元都是表示两种状态,所以大家常常直接以波特率来表示比特率 。

串口通讯协议

在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其数据帧组成如下:

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

下面我们来实际验证一下其数据帧是不是真的是这样的。编写如下代码:

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

代码很简单,就是使用串口不断地往外发数据0xAA(当然发送其它数据也是可以的) 。我们的串口配置如下:

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

我们可以使用示波器或者逻辑分析仪抓取实际信号看看数据是不是符合上面的帧格式。这里,我们使用逻辑分析仪抓取USART1的发送信号线(TX):

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

从实际结果中我们可以看到的确是按帧格式来发的。这里可能会有人有疑问,上面那个数据帧的图片中有个空闲状态,这个又是什么呢?空闲、空闲,当然是没有在发数据时候的状态呀,我们把我们的代码改为:

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

在初始化完成之后只发送一次0xAA,逻辑分析仪抓到的数据为:

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

可见,空闲状态是个高电平。在上一个的范例中,我们一直在while循环中发送数据0xAA,所以就没有空闲状态。

在这个实验中我们需要知道的是两个点是:

串口发送数据是低位先发的。我们单片机发0xAA(10101010B),所以逻辑分析仪抓到的有效数据是01010101B。

单片机的串口使用的是TTL电平,为正逻辑电平信号。逻辑分析仪抓到的数据0对应着实际电压0~0.5V,数据1对应着实际电压2.4V-5V,

经常与TTL电平标准做对比的是RS-232电平标准,如:

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

常见的电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,RS-232电平标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。

在旧式的台式计算机中一般会有 RS-232 标准的 COM 口(也称 DB9 接口) :

在这个示例程序中,我们设置的串口波特率为115200bps。在串口通讯中,码元只用1个二进制数来表示(即只有0 和 1两种状态),所以波特率与比特率在数值上是相等的。而比特率表示的是每秒钟传输的二进制位数,那我们知道传一位数据的时间岂不是就可以反推出波特率是多少了吗?从逻辑分析仪中,我们可以知道发送一位数据的时间如下:

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

发送一位数据的时间大约为8.667us,所以1秒钟发送多少位数据是可以算出来的:

算出来的波特率为115380bps,与115200bps很相近。最终肯定是有一定的误差,这个误差产生的原因包括逻辑分析仪的质量及我们的测量环境等等因素。但是这个误差也是在允许的范围内的,可以看看串口助手接收到的数据是不是正确的:

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

可见,数据接收正确,也就是波特率对的上了。

串口波特率对不上怎么解决?

在实际中。我们可能会遇到这样的情况,代码里配置的波特率与串口助手上设置的波特率一样了,但还是出现异常。

异常情况如我们往串口助手发送字符串,串口助手上本该显示的字符串出现了乱码。或者我们往串口助手发送一个数据,发现数据移位了。

出这种情况大多是波特率对应不上,我们就得自己检查我们的底层文件了,代码中的某个与波特率计算相关的值(时钟)与实际不匹配了,就会出现这样的现象,比如之前我的一位同事就遇到这样的情况就是这个原因导致的。

我们用STM32的时候,一般都是使用外部晶振,比如STM32F103系列,可输入的外部晶振的范围是4~16MHz:

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

经验值往往是8MHz,而且一般的demo工程底层代码里默认的也是设置为8MHz,比如:

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

但是,如果实际晶振贴的不是8MHz的话,就出问题了(比如串口波特率就不正确了)。追根溯源,串口波特率是配进USART_Init函数中的,打开这个函数:

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

计算串口波特率需要一个apbclock变量,而这个值得来源从RCC_GetClocksFreq函数来,再打开这个函数:

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

所以要注意的是,HSE_VALUE这个值要与实际做对应。

遇到这种问题找谁说理去。。经验就是不断采坑不断积累的一个过程,早点遇到坑可能也是一件好事。像类似底层的问题很少遇到,但是一旦遇到那就得比较棘手的问题了,需要很有耐心地去查找。

能用稳定的芯片是一件很幸福的事情,用不稳定、不成熟的芯片的时候,那个才是真的难啊,真让人怀疑人生啊。。。

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

    关注

    14

    文章

    1564

    浏览量

    77322
  • 波特率
    +关注

    关注

    2

    文章

    309

    浏览量

    34350
收藏 人收藏

    相关推荐

    RS232通信的波特率设置说明

    RS232通信的波特率设置是确保数据正确传输的关键参数之一。以下是对RS232通信波特率设置的说明: 一、波特率的概念 波特率是指每秒传输的比特数(bps),是衡量数据传输速度的重要指
    的头像 发表于 12-10 16:26 1741次阅读

    波特率设置中的常见问题解析

    在数字通信系统中,波特率是一个关键参数,它直接影响数据传输的效率和可靠性。然而,在实际应用中,波特率的设置往往会引起一些常见的问题。 一、波特率与数据速率的混淆 问题描述: 许多人会将
    的头像 发表于 11-22 10:06 653次阅读

    波特率与串行通信的关系 各种设备波特率转换的方法

    波特率(Baud Rate)是串行通信中的一个重要参数,它指的是信号传输的速率,即单位时间内传输的符号(或信号状态)的数量。在串行通信中,波特率决定了数据传输的速度,因此对于通信效率和设备兼容性
    的头像 发表于 11-22 10:01 853次阅读

    常见的波特率标准和协议

    波特率是指在数据通信中,每秒钟传输的符号数(或比特数),是衡量数据通信速度的重要指标。在不同的通信协议和场景中,常见的波特率标准和协议有所不同。以下是一些常见的波特率标准和协议: 一、串口
    的头像 发表于 11-22 09:56 2956次阅读

    波特率设置在串口通信中的重要性

    在现代通信技术中,串口通信作为一种基本的数据传输方式,扮演着不可或缺的角色。无论是在计算机与外部设备的连接,还是在工业自动化系统中的数据交换,串口通信都发挥着重要作用。波特率,作为串口
    的头像 发表于 11-22 09:51 1072次阅读

    波特率的定义和计算方法 波特率与数据传输速度的关系

    波特率的定义 波特率(Baud Rate),又称调制速率或传符号,是指每秒传输的符号数目,单位为波特(Bd)。它是一个数字信号通信中重要的参数,在串行通信协议中经常被用作衡量串行数据
    的头像 发表于 11-22 09:49 4274次阅读

    MCU串口自动识别波特率原理分析

    现在的单片机资源越来越丰富了,其中我们常用的串口也是内部集成了多个,关键功能也越来越强了。 我们有些应用可能会用到串口自动识别波特率,今天就来讲讲MCU串口自动识别
    的头像 发表于 10-23 16:12 981次阅读
    MCU<b class='flag-5'>串口</b>自动识别<b class='flag-5'>波特率</b>原理分析

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    频率是两个关键参数,它们之间存在一定的关系,并且UART串口有一系列常用的波特率。以下是对这两个概念的介绍。 一、UART波特率和传输频率的关系 1. 定义与区别 波特率(Baud R
    的头像 发表于 10-06 16:12 4014次阅读
    uart<b class='flag-5'>波特率</b>和传输频率的关系 UART<b class='flag-5'>串口</b>的常用<b class='flag-5'>波特率</b>为多少

    串口通信中的波特率你真的了解吗?差距竟如此重要!

    波特率串口通信中的作用在串口通信中,波特率起着至关重要的作用。因为在传输数据时,发送方和接收方需要以相同的波特率进行通信。如果两端的
    的头像 发表于 08-27 11:46 1837次阅读
    <b class='flag-5'>串口</b>通信中的<b class='flag-5'>波特率</b>你真的了解吗?差距竟如此重要!

    USBH CDC如何修改通讯波特率

    硬件平台:正点原子探索者 + CH340 软件:CubeMX,MDK 已经实现USBH接口通过CH340和外部串口通讯波特率19200。 目前无法修改通讯
    发表于 05-31 06:07

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

    在通信和电子测量领域,串口波特率是一个至关重要的参数,它决定了数据在串行通信线上的传输速率。使用示波器来测量串口
    的头像 发表于 05-27 16:25 5664次阅读

    KT142C语音芯片工作电压多少?电流是多少?串口波特率多少?多大的喇叭?

    KT142C-sop16语音芯片ic工作电压多少?电流是多少?串口波特率是多少?支持多大的喇叭?
    的头像 发表于 05-23 09:45 562次阅读
    KT142C语音芯片工作电压多少?电流是多少?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>多少?多大的喇叭?

    使用cubemx设置CAN波特率实际测得的波特率不一致的原因?

    使用cubemx设置CAN波特率实际测得的波特率不一致。
    发表于 03-26 07:06

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

    假如要测量波特率为9600, 则每一比特位的时间为:1/9600 ≈ 104 μs,一般示波器横向上每个大格子里5个小格子,要想看清一比特位一般需要一个小格子就够了,则时基为:104 μs * 5 = 520 μs, 也就是说时基要500 μs。
    发表于 03-18 12:25 2543次阅读
    如何用示波器<b class='flag-5'>测量</b><b class='flag-5'>串口</b><b class='flag-5'>波特率</b>

    为啥要转换波特率 波特率和传输速率的关系

    对于串行多主 CAN 总线,如果波特率被称为“500000波特”,则 CAN 上的该端口每秒最多可传输500000位。
    的头像 发表于 03-06 17:38 5584次阅读
    为啥要转换<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和传输速率的关系