UART 如何实现波特率自动检测原理介绍

news2024/11/18 7:39:46

为什么需要波特率自动检测机制

  1. 我们都知道,串口通讯是需要约定波特率才能够进行准确的通讯。
  2. 此时假设,你们公司开发了一个板子,有一个串口与外接设备进行通讯。因为你们公司开发的产品要提供给多个客户,而有些客户可能之前就有一个类似功能的产品,之所以现在用你们公司的产品,可能是基于安全,价格,稳定性等因素考虑。
  3. 现在,你规定自己板子上的串口波特率为115200,而你客户之前用的那个产品波特率是9600。你板子都要卖给客户,总不可能要求客户去该他们的波特率吧。好,你们公司为了保住这个订单,现在修改波特率为9600,然后安排人将程序重新烧录到产品中。
  4. 这个订单是保住了,现在又来了一个客户,他们也想要用你们的产品,不过他们的波特率是19200。没办法,客户是上帝,你们又得重新修改波特率,然后烧录。
  5. 人工成本也是钱呀,所以说,如果不提出一个好的解决办法,这家公司迟早会凉凉。
  6. 为了解决这个问题,我们可用用0x55/0xAA这两个特殊值进行处理。

波特率自动检测机制的原理

  1. 我们知道0x55/0xAA从二进制角度来看,就是变化的01。我们知道,0是低电平,1是高电平。而0x55/0xAA这两个特殊的值每次变化时候,他们的01都是1bit。因此,我们只需要计算出一个高电平或者一个低电平的持续时间,即可算出波特率。
  2. 例如,现在我们截取0x55/0xAA波形中的一小段如下。现在如果我想知道这里的波特率,只需要测量出图中所指示的低电平部分持续时间即可。
  3. 测量低电平持续时间也很简单,打开MCU的双边沿检测。对端设备串口发送0x55/0xAA,此时MCU检测到下降沿那么就打开定时器,当检测到上升沿那么就关闭定时器。最终将定时器中的值读取出来,即可算出波特率。

在这里插入图片描述

代码

  1. 如下为网上找到的一段波特率自适应的代码,我进行简单的分析。
  2. 这里就是让 GPIO10 作为 RX 输入,不过将该引脚设置为 UART 之前,先将该引脚设置为浮空输入,测试出对端设备的波特率,然后再将该引脚设置为 UART。
  3. 打开定时器,之后 CPU 轮询 GPIO10,检测 32 次该引脚的电平变化,找到最大的两次电平变化差值。然后再将该值进行 0.75% 的修正。最终返回算出来的波特率。
  4. 这个时候肯定会有人问,如果对端设备的波特率是 115200,但是我算出来的是115249 ,阁下如何应对呢?木有关系,首先 UART 是存在一个波特率误差容限的,而且你在设置一个非标准波特率时,芯片也会匹配到一个接近的标准波特率。因为波特率本身就是利用时钟产生的。
u32 USART1_Baud(void)
{
  u16 t1=0,t2,t=0; // 定时器寄存器为16位
  u32 b1,b2;
  u32 i;

  GPIO_Init(GPIOA, 10, GPIO_IN_FLOAT); // GPIOA.10浮空输入
  TIM_Open(Tim3); // 开TIM3的时钟
  TIM_Enable(TIM3); // 开启TIM3
  b1 = GPIO_Pin_Get(GPIOA,10); // 读GPIOA.10的电平
  for(i=0;i<32;) // 连续检测GPIO.10引脚32次电平变化
   {
    b2 = GPIO_Pin_Get(GPIOA,10); // 读GPIOA.10的新值
    if(b2 != b1) // 如果有电平变化
      {
        t2 = TIM3->COUNT; // 读定时器中的值
        b1 = b2; // 更新为新的引脚值

        if((t1 == 0)&&(t==0)) // 第一个电平变化
        {
          t1 = t2; // 记录第一个时刻点
        }
        else // 不是第一个电平变化
        {
          if(t == 0) // 第一段电平
          {
            t = t2-t1; // 记录第一段电平所用时间
          }
          else // 不是第一段电平
          {
            if((t2-t1)< t) // 保留电平段的最小值
              {
                t = t2-t1;
              }
          }
          t1 = t2; // 更新为新的时刻点
        }
        i++; // 电平变化数+1
      }
   }
  TIM_Close(Tim3); // 关闭TIM3的时钟
  return ((u32)t*403/400);
  // 修正波特率值(加上电平变化的斜率,大概为0.75%,经验值)
}

参考

  1. 博客园:UART串口波特率自适应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2173968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

E9OA解决文档附件没有关联文档正文问题

业务背景&#xff1a; OA通知流程已经提交后在审批中发现漏上传了文档附件。临时放开审批结点文档附件编辑&#xff0c;请审批结点领导将附件上传后再审批。最终在流程中查看可以看到正文和附件&#xff0c;但是在通知文档正文中没有关联文档附件&#xff0c;导致大多数人员在通…

crypto-js解密报错malformed utf-8 data

在进行加解密处理时出现这个问题。 但是当在一个完整程序运行环境内加密字符串&#xff0c;解密字符串是没问题的。 当把加密的字符存储到txt文件&#xff0c;在读取解密时出现错误无法解密。 最后&#xff0c;使用res.replace(/\s/g,‘’)正则过滤掉txt文件内的空格就成功了。…

电商技术选型:Spring Boot在线商城系统

4 系统设计 ONLY在线商城系统的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没有经…

[ComfyUI]Flux:太美了!古风华服与现代DJ演绎。灼灼荷花瑞,亭亭出水中

大家好我是安琪&#xff01;&#xff01;&#xff01; F.1-汉服人像艺术-国风-氛围感 简介 今天介绍一款Flux LORA模型&#xff1a;F.1-汉服人像艺术-国风-氛围感-liangyi&#xff0c;这是一款以古代汉服女性写真为主题的Flux LORA模型。属于人物主体&#xff0c;增加中国传统…

Java项目实战II基于Java+Spring Boot+MySQL的学院班级回忆录(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在时光的长河中&#xff0c;班级的记忆如同璀璨星辰&#xff0c;照亮了我们共同的青春岁月。为了珍藏…

Redis篇(应用案例 - 商户查询缓存)

目录 一、什么是缓存? 二、为什么要使用缓存 三、如何使用缓存 四、添加商户缓存 1. 缓存模型和思路 2. 代码如下 五、缓存更新策略 1. 内存淘汰 2. 超时剔除 3. 主动更新 六、数据库缓存不一致解决方案 1. 数据库缓存不一致解决方案 2. 数据库和缓存不一致采用什…

C++之STL—常用集合算法

set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); // 求两个集合的交集 // **注意:两个集合必须是有序序列** // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //…

评估员工绩效的 5 个最佳实践

使用目标。 员工目标是设定期望和评估员工绩效的最有效、最客观的方式。由于目标是在年初或季度初由员工和经理共同制定的&#xff0c;因此双方可以在此过程中讨论他们期望在特定时期内完成的目标&#xff0c;并就成功的样子达成一致。 例如&#xff0c;如果内容营销人员的个人…

代码随想录_刷题笔记_第三次

字符串 — KMP算法&#xff08;理论&#xff09; **解决问题&#xff1a;**字符串匹配的问题&#xff08;eg&#xff1a;文本串 aabaabaaf 模式串 aabaaf 求在文本串中是否出现过模式串&#xff09; **暴力匹配&#xff1a;**当 b 和 f 不匹配时&#xff0c;整体向后跳一位再进…

婚恋交友小程序的设计思路与用户体验优化

在数字化时代&#xff0c;婚恋小程序作为一种新兴的婚恋交友平台&#xff0c;正逐渐成为单身人士寻找伴侣的重要工具。一个优秀的婚恋小程序不仅要有创新的设计思路&#xff0c;还要注重用户体验的优化。编辑h17711347205以下是婚恋小程序的设计思路与用户体验优化的详细阐述&a…

【设计模式】精通高级行为模式:揭秘状态、中介者及其它模式的深层机制

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】万字详解…

PDD 各岗位薪资一览表

PDD 昨天聊到 PDD 可能会执行双休政&#xff0c;当中提到了「PDD 的年包在互联网行业中名列前茅」&#xff0c;不少同学一下子来兴趣了。 我这里也从脉脉中找到一份较新的 PDD 各岗位薪资一览表&#xff1a; 注意&#xff0c;这里的平均月薪的计算方式是年收入除以 12&#xff…

U盘打开提示要格式化:深度解析、恢复策略与预防之道

现象透视&#xff1a;U盘遭遇格式化预警 在日常的数字生活中&#xff0c;U盘作为便捷的数据存储与传输工具&#xff0c;扮演着不可或缺的角色。然而&#xff0c;当您满怀期待地插入U盘准备访问数据时&#xff0c;却可能遭遇系统突如其来的提示——“U盘需要格式化才能使用”。…

25考研咨询周开启,西安电子科技大学是否改考408??

学长这几天帮大家问了西安电子科技大学是否会从833、834、953改考为408&#xff1f; 西电老师回复&#xff1a;根据上级文件要求&#xff0c;招生简章以及专业目录会在网上报名开始前公布&#xff0c;专业课不会又大变动&#xff01; 因为大家安心复习即可&#xff0c;保证今…

C++编程基础:内联函数、auto关键字、基于范围的for循环和nullptr

内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 如果在函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。 特性 1.我们可以这…

肌筋膜炎可以自愈吗

肌筋膜炎是一种临床常见的疾病&#xff0c;主要表现为肌肉的筋膜发生无菌性炎症&#xff0c;可能由多种因素诱发&#xff0c;如风寒侵袭、疲劳、外伤、不良生活习惯及工作姿势等。关于肌筋膜炎是否可以自愈&#xff0c;主要取决于病情的严重程度和个体差异。 一、肌筋膜炎的自…

云计算Openstack

OpenStack是一个开源的云计算管理平台项目&#xff0c;由美国国家航空航天局&#xff08;NASA&#xff09;和Rackspace公司合作研发并发起&#xff0c;以Apache许可证授权。该项目旨在为公共及私有云的建设与管理提供软件支持&#xff0c;通过一系列相互协作的组件实现云计算服…

8610 顺序查找

### 思路 1. **创建顺序表**&#xff1a;从输入中读取元素个数和元素值&#xff0c;构造顺序表。 2. **顺序查找**&#xff1a;在顺序表中依次查找关键字&#xff0c;找到则返回位置&#xff0c;否则返回0。 ### 伪代码 1. **创建顺序表**&#xff1a; - 动态分配存储空间。…

统信服务器操作系统【虚拟机CPU核数显示不对】处理方案

虚拟机CPU核数显示不对的问题现象、问题原因以及解决方案 文章目录 一、问题现象二、问题原因三、解决方案 一、问题现象 新建虚拟机安装过程分配 CPU 个数为 20 个&#xff0c;进入系统终端执行 lscpu 命令查看 CPU 只显示 1 个问题。 如图下所示&#xff1a; 二、问题原因 …

设备管理平台-支持快速开发

技术路线&#xff08;同时支持前后端分离 / 前后端一体&#xff0c;可用于网关或者服务器部署&#xff09; 前端&#xff1a;layui-v2.9.17 后端&#xff1a;Net8.0 使用组件 Swagger、Jwt、Freesql、MiniExcel、MemoryCache(存储登录用户信息&#xff0c;代替HttpContext.S…