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

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

  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); // 开启TIM3b1 = 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.mzph.cn/news/880545.shtml

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

相关文章

MacOS Catalina 从源码构建Qt6.2开发库之02: 配置QtCreator

安装Qt-creator-5.0.2 在option命令中配置Qt Versions指向 /usr/local/bin/qmake6 Kits选入CLang

SSM+Vue社区物业管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

【cache】浅析四种常用的缓存淘汰算法 FIFO/LRU/LFU/W-TinyLFU

本文浅析淘汰策略与工作中结合使用、选取&#xff0c;并非针对算法本身如何实现的 文章目录 FIFOLFULRUW-TinyLFU实践与优化监控与调整 FIFO first input first output &#xff0c; 先进先出&#xff0c;即最早存入的元素最先取出&#xff0c; 典型数据结构代表&#xff1a;…

Elasticsearch使用Easy-Es + RestHighLevelClient实现深度分页跳页

注意&#xff01;&#xff01;&#xff01;博主只在测试环境试了一下&#xff0c;没有发到生产环境跑。因为代码还没写完客户说不用弄了( •̩̩̩̩&#xff3f;•̩̩̩̩ ) 也好&#xff0c;少个功能少点BUG 使用from size的时候发现存在max_result_window10000的限制&…

TypeScript介绍和安装

TypeScript介绍 TypeScript是由微软开发的一种编程语言&#xff0c;它在JavaScript的基础上增加了静态类型检查。静态类型允许开发者在编写代码时指定变量和函数的类型&#xff0c;这样可以在编译时捕获潜在的错误&#xff0c;而不是等到运行时才发现问题。比如&#xff0c;你…

基于STM32的无人驾驶车辆系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据采集与处理路径规划与避障控制实时反馈与控制系统应用场景结论 1. 引言 随着无人驾驶技术的发展&#xff0c;嵌入式系统在无人驾驶车辆中的应用变得越来越重要。STM32作为高效…

Java SPI 原理、样例

在 Java 中&#xff0c;SPI&#xff08;Service Provider Interface&#xff09;全称为服务提供者接口&#xff0c;它是一种用于实现框架扩展和插件化的机制。 一、SPI 作用 允许在运行时动态地为接口查找服务实现&#xff0c;而不需要在代码中显式地指定具体的实现类。 这使得…

WordPress精选文章如何添加侧边栏和页面?

WordPress精选帖子是一项功能&#xff0c;可让用户在其网站主页或其他值得注意的部分突出显示特定帖子。这些精选帖子通常以视觉上独特的方式显示&#xff0c;例如以滑块、网格或轮播格式显示&#xff0c;以提高其可见性和对访问者的吸引力。 网站所有者可以手动选择他们想要推…

云计算Openstack

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

MMD模型及动作一键完美导入UE5-衣服布料模拟(四)

1、给角色刷布料 1、打开角色,通过Window->Clothing打开模型布料窗口 2、选中裙子右键,创建布料数据 3、选择裙子,右键->应用布料数据 4、激活布料画笔,就可以开始绘制布料了 5、调整画笔大小和布料值进行绘制,布料值为0表示刚体

高校教师成果管理小程序的设计与实现springboot(lw+演示+源码+运行)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

5分钟精通Excel在go中的使用

一些简单操作可以在官方文档中找到&#xff0c;应该足够无经验的朋友们入门 介绍 - 《Excelize v2.2 中文文档》 - 书栈网 BookStack 这里贴一个中文版的链接&#xff08;以excelize库为例&#xff0c;相对其他库来说&#xff0c;体验很不错&#xff09;&#xff0c;不过要注…

c++反汇编逆向还原——for循环(笔记)

c反汇编逆向还原代码for循环的实现&#xff0c;for循环和while循环在逆向还原的区别 一、汇编 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的地址赋值给a&#xff0c;相…

第一弹:llama.cpp编译

1.编译llama.cpp命令行&#xff08;电脑版本&#xff09;&#xff1b; 2.交叉编译安卓命令行版本。 一、Llama.cpp是什么&#xff1f; 二、Llama.cpp编译 首先我们尝试编译llama.cpp. 2.1 下载llama.cpp 项目的github地址&#xff1a; https://github.com/ggerganov/llama…

Linux---文件io

1.系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface&#xff0c;API)。是应用程序同系统之间数据交互的桥梁。 C标准函数和系统函数调用关系。一个helloworld如何打印到屏幕。 man手册中一共有九卷&#xff0c;其中一卷就有讲到系…

连锁店收银系统如何选择?

在新零售背景下&#xff0c;连锁店的收银系统扮演着至关重要的角色。随着科技的不断发展和消费者需求的不断变化&#xff0c;一款功能齐全的收银系统不仅可以提高便利店的运营效率&#xff0c;还可以提供更好的消费体验。以下是连锁店收银系统必备的功能。 1.收银系统能支持独…

【二十七】【QT开发应用】VS如何复制项目,QT无边窗窗口Pro版本,信号与信号槽的应用,背景图片自适应控件大小

VS复制项目 在使用VS的过程中,有的时候我们需要复制我们已经存在的项目. 我们可以先创建一个新的项目. 接着把需要复制的项目的文件复制粘贴到新的项目文件夹中. 不要忘记添加现有项目. CFrameLessWidgetBase.h #pragma once #include <QWidget> class CFrameLessWi…

书生大模型实战(从入门到进阶)L2-茴香豆:企业级知识库问答工具

目录 茴香豆介绍 茴香豆本地标准版搭建 环境搭建 配置服务器&#xff1a; 搭建茴香豆虚拟环境&#xff1a; 安装茴香豆 下载茴香豆 安装茴香豆所需依赖 下载模型文件 更改配置文件 知识库创建 测试知识助手 命令行运行 Gradio UI 界面测试 本文是对书生大模型L2-茴香…

SwiftUI简明概念(3):Path.addArc的clockwise方向问题

一、画个下半圆 SwiftUI中绘制下半圆的一个方法是使用Path.addArc&#xff0c;示例代码如下&#xff1a; var body: some View {Path { path inpath.addArc(center: CGPoint(x: 200, y: 370), radius: 50, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 180.0), …

自然语言处理实战项目:从基础到实战

自然语言处理实战项目&#xff1a;从基础到实战 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能的重要分支&#xff0c;致力于让计算机能够理解、生成和处理人类语言。NLP 在搜索引擎、智能客服、语音助手等场景中扮演着关键角色。本文将带…