UART-通用异步收发器
1. UART的基本工作原理
UART通信主要有两个部分构成:发送器和接收器,也就是我们常见的(RX接收,TX发送)两个独立的线路来实现数据的双向传输,由于是异步的,UART并不需要时钟信号,而是通过设定一定的波特率来进行双方的通信,可以理解为协议。
在UART中,数据规定通过固定的格式进行发送,格式形式(起始位,数据位校验位,停止位)
起始位:用于通知接收端即将开始数据传输,通常是一个低电平。
数据位:就是我们要发送的数据内容,一般是5-9位。
校验位:用于错误检测,可选
停止位:表示数据结束,通常位高电平
这些格式构成一个数据帧,主机与从机通信的时候就是通过一帧一帧的数据进行通信。
那么我们就来简单举一个例子:
在UART通信中,如果启用了校验位,通常采用奇校验或偶校验来检测传输过程中可能出现的单比特错误。具体来说,校验位是一位额外的数据位,通过对前面的数据位进行“加和”判断奇偶性来确定其值。接收端通过计算收到的数据位和校验位的奇偶性,判断数据是否完整正确。
假设发送的数据为01000001(即ASCII字符“A”),8位数据中包含两个“1”,是偶数个:
- 奇校验:校验位设为1,使得整个数据帧的“1”位总数为奇数。
- 最终发送的帧:
起始位 (0) | 01000001 | 校验位 (1) | 停止位 (1)
- 最终发送的帧:
- 偶校验:校验位设为0,使得整个数据帧的“1”位总数为偶数。
- 最终发送的帧:
起始位 (0) | 01000001 | 校验位 (0) | 停止位 (1)
- 最终发送的帧:
那么我们就可以根据例子来总结得到,校验位的作用:
当我们规定校验方式为奇校验的时候,1的个数要为奇数,如果现在数据(一串二进制码例如上面的01000001)当中 有两个1,那么校验位就位1,现在有3个1。接收端接收到数据帧之后,会按照格式读取数据帧,首先读取起始位,一般位0,那么从机就知道接下来的二进制就是数据位,由于于我们规定了数据位的个数,一般是(5-9)位,然后是校验位这里是1,停止位。数据读取完毕,如果这时候计算得到的数据位当中的1和校验位的1个数相加为奇数,那么数据没有错误,如果相加为偶数,则数据传输出现错误。
当我们规定校验方式为偶校验的时候,数据位中1的个数加上校验位中1的个数要为偶数,否则数据传输出现错误。
当然,校验位只能用于单个数据帧的检验,并不能用于多个数据帧的检验
2. 实现UART发送功能
UART的发送过程涉及将要发送的数据(通常是8位)转换为串行格式,然后按位输出到Tx引脚。
步骤:
- 配置波特率:设定UART模块的波特率,以确保发送端和接收端的波特率一致。
- 加载数据:将要发送的数据写入UART发送缓冲区。
- 起始位:设置Tx引脚为低电平(0),通知接收端即将开始发送数据。
- 发送数据位:从最低有效位(LSB)开始依次发送每一位数据。
- 校验位(可选):如果启用了校验位,则按照设定的校验规则添加校验位。
- 停止位:发送1位或2位的高电平,表示数据传输结束。
- 等待传输完成:通常通过检查发送缓冲区是否为空或传输完成标志位。
配置UART的波特率(Baud Rate)是实现UART通信的关键步骤之一。波特率决定了每秒钟传输的位数,通常发送端和接收端必须设置相同的波特率,才能保证通信的同步
波特率的单位:bit/s,也就是每秒钟传输位数的多少,那么我们要如何配置波特率呢?
1. 波特率计算公式
不同的MCU或者处理器通常都会有一个波特率生产寄存器,比如在中断当中,就有一个(UART_BRR寄存器)我们通过设置这个寄存器的值,就能够产出需要的波特率。具体的计算公式如下:
其中:
- 时钟频率:MCU主时钟频率(如16 MHz、8 MHz)。
- 分频因子:通常为8或16,具体取决于MCU的UART模块设置。
- 寄存器值:设置在UART模块的波特率寄存器中,用于配置实际波特率。
那么UART_BRR是一个16位的寄存器,UART_BRR寄存器的16位通常分为两个部分:
- DIV_Mantissa(整数部分):通常占高12位([15:4]位)。
- DIV_Fraction(小数部分):通常占低4位([3:0]位)。
所以,UART_BRR
寄存器最终的16位值为0x0673
(104的十六进制为0x67,小数部分为3)。将这个值写入UART_BRR
寄存器,即可实现9600的波特率。通过这样,就能配置波特率。
2.缓冲区?
那么将要发送的数据写入UART发送缓冲区。缓冲区具体指的是什么?
在UART通信中,“缓冲区”是指一个临时存储区域,用于存放即将发送或刚接收的数据。UART缓冲区一般分为发送缓冲区和接收缓冲区,目的是让数据的读写过程更加顺畅和稳定,避免传输速度与数据处理速度不匹配的问题。
其实,缓冲区也是一个寄存器,在发送的时候,
1. 发送缓冲区
发送缓冲区:是用来暂时存储即将通过UART发送出去的数据。当数据进入缓冲区,也就是寄存器的时候,UART硬件会从缓冲区中取出数据,通过TX引脚发送数据出去,
- 作用:当程序将数据写入发送缓冲区后,UART硬件会从缓冲区逐位取出数据,通过TX引脚发送出去。
- 常见实现:
- 单字节寄存器:一些简单的UART实现只有一个字节大小的发送寄存器,比如USART_DR寄存器(在STM32中)。每次只能写入一个字节,硬件在发送完该字节后会触发“发送缓冲区空”标志。
- 多字节缓冲区:为了提高效率,某些系统会使用一个环形缓冲区(FIFO队列),可以存放多个字节。这样,程序可以在较短时间内将多字节数据写入发送缓冲区,而UART硬件会逐字节从缓冲区取数据发送出去。
2. 接收缓冲区
接收缓冲区:用来暂时存储UART接收到的数据,当数据从RX引脚接收后,UART硬件将数据暂时存入到接收缓冲区当中,当接收缓冲区满时,UART会设置一个标志位或触发一个接收中断,通知主程序读取数据。主程序读取缓冲区中的数据后,标志位会被清除,表示接收缓冲区可以接收新的数据。
- 作用:当数据通过RX引脚接收后,硬件会将其存入接收缓冲区中。这样,程序可以在稍后再读取数据,而不必完全同步于硬件的接收速度。
- 常见实现:
- 单字节寄存器:类似于发送缓冲区,一些简单的UART实现也会有单字节的接收寄存器。当接收到一个字节的数据时,UART会触发“接收缓冲区满”标志,通知程序读取。
- 多字节缓冲区:为了避免数据丢失,UART也可以使用多字节环形缓冲区,允许接收端在不忙时读取数据,特别适合高波特率和连续数据的应用。
以发送缓冲区为例,典型的工作过程如下:
- 加载数据:程序将数据写入发送缓冲区。
- UART发送:UART硬件从发送缓冲区中逐字节取出数据,通过TX引脚发送出去。
- 缓冲区管理:如果使用的是单字节寄存器,发送完一个字节后,缓冲区标志会被清空,表示可以加载新的数据;如果是多字节缓冲区,UART硬件会持续发送,直到缓冲区为空。
3. 实现UART接收功能
UART接收过程则是将接收端Rx引脚上的串行数据转换为并行数据,再读入接收缓冲区。
步骤:
- 等待起始位:UART接收器持续监测Rx引脚,检测到低电平即认为接收到了起始位,准备接收数据。
- 采样数据位:根据波特率和位时间(Bit Time),依次采样数据位。
- 校验位(可选):如果启用了校验,验证接收到的数据是否满足校验要求。
- 停止位检测:检查停止位是否为高电平,确认数据完整性。
- 存储数据:将接收到的数据写入接收缓冲区,等待上层程序读取。
4. 中断方式实现UART收发
在实际应用中,常用UART中断来实现非阻塞的收发数据,避免程序在等待数据时挂起。
- 发送中断:在发送数据时,可以通过发送完成中断通知处理器开始下一次发送。
- 接收中断:在接收数据时,可以通过接收中断通知处理器有新数据可读。
UART可以通过接收中断通知主程序有新数据可读。中断触发时,程序可以立即读取数据并处理。中断触发,程序从缓冲区当中读取数据。
以下是UART接收中断的典型工作流程:
-
接收数据:UART硬件从RX引脚接收到数据后,会将数据存入接收缓冲区中。
-
触发中断:数据存入接收缓冲区后,UART硬件会设置一个“接收中断标志位”(或称为“接收缓冲区满”标志位),然后触发接收中断。
-
中断服务程序(ISR)处理:
- 在接收中断服务程序(Interrupt Service Routine, ISR)中,程序可以检查接收缓冲区是否有新数据。
- 如果有新数据,ISR会从接收缓冲区中读取数据,存入用户定义的变量或缓冲区,供进一步处理。
-
清除标志位:读取数据后,接收缓冲区的标志位会被清除,这样UART硬件可以接收新的数据。
相关文章:
UART-通用异步收发器
1. UART的基本工作原理 UART通信主要有两个部分构成:发送器和接收器,也就是我们常见的(RX接收,TX发送)两个独立的线路来实现数据的双向传输,由于是异步的,UART并不需要时钟信号,而是…...
Linux——— 信号
文章目录 前言:引入信号生活中的例子信号概念见一见Linux中的信号 浅度理解信号信号处理(浅谈):如何自定义捕捉 信号保存(浅谈) 信号产生系统调用产生异常产生:浅谈除0异常浅谈解引用野指针异常Core &&…...
安全见闻-web安全
web安全 一、web程序简介 1. Web程序的基本构成 2. 工作流程 3. 安全性 二、JavaScript代码库 1. 代码库的概念和用途 2. 常见的代码库 三、框架 1. 常见的前端框架 2. 常见的后端框架 四、数据库 1. 数据库的分类 2. 数据库的潜在漏洞 3. 学习数据库的重要性 五、…...
华为手机卸载系统应用的方法
摘要: 1.手机环境:手机需要开启开发者模式并使用usb连接电脑,并选择文件传输模式 2.电脑环境:使用鸿蒙工具箱进行傻瓜操作或安装adb工具进行命令卸载 3.鸿蒙工具箱和adb工具本质都是使用adb shell pm uninstall -k --user 0 xx…...
力扣算法笔记——生成随机数组
题目信息: 给两个随机数和N,生成M到N的随机不重复数组,且M<N。 示例:输入M 2, N5, 输出 [4,3,2,5]. 思路:洗牌算法,先遍历M到N之间所有的数字,将得到的结果存入一个集合中,将集合从后往前遍历…...
Anaconda和Pycharm超详细安装教程(2024版本+Win11)
详细安装:https://download.csdn.net/download/qq_40379132/89924782 一、安装Anaconda 1.1 下载Anaconda 在官方网站(Free Download | Anaconda)上下载适用于你的操作系统的 Anaconda 安装包。(这里以windows为例)…...
代码随想录:从中后/中前遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 用分治思想,后序遍历是左右中,中序遍历是左中右,后序遍历的最后一个元素就是根节点, 在中序遍历中找到它的位置,它前面的为左子树,后面的为右子树,并能计…...
2-134 基于matlab的图像边缘检测
基于matlab的图像边缘检测,采用六种算子(分别是gabor、拉普拉斯、priwitt、robert、sobel、wallis微分算子),对图象进行边缘检测比较,输出边缘检测结果。可对比效果优劣。程序已调通,可直接运行。 下载源程序请点链接…...
【Java并发编程】线程池详解
一、简介 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor 类,帮助开发人员管理线程并方便地执行并行任务。了…...
ThingsBoard规则链节点:GPS Geofencing Events节点详解
引言 1. GPS Geofencing Events 节点简介 2. 节点配置 3. 使用场景 3.1 物流跟踪 3.2 资产管理 3.3 安全监控 3.4 农业监测 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 GPS Geofencing Events 是 ThingsBoard 规则链中的一个重要节…...
Jmeter基础篇(19)JSR223预处理器
前言 JSR223预处理器是Apache JMeter中的一个组件,它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大,因为它让测试人员能够利用如Groovy、JavaScript(Nashorn引擎)、BeanShell…...
通过js控制css变量
在JavaScript中,你可以通过操作CSS变量(也称为自定义属性)来动态改变样式。CSS变量在CSS中使用 – 前缀定义,例如 --main-color: red;。在JavaScript中,你可以使用 document.documentElement.style.setProperty 方法来…...
Docker:容器化和虚拟化
虚拟化 虚拟化是一种资源管理技术,它将计算机的各种实体资源(如CPU、内存、磁盘空间、网络适配器等)予以抽象、转换后呈现出来,并可供分割、组合为一个或多个电脑配置环境。这些资源的新虚拟部分是不受现有资源的架设方式、地域或…...
OpenSSL
OpenSSL 概述 OpenSSL 是一个开源的、安全传输协议实现工具,广泛应用于数据加密与解密、证书生成与管理以及其他安全性相关的任务。在现代网络安全中,OpenSSL 被用于构建和维护 SSL/TLS 通信,确保数据在传输过程中的机密性和完整性。 简单来…...
CSS 常见选择器
1. 基础选择器 元素选择器 选择所有指定类型的 HTML 元素。 p {color: blue; }选择所有 p 标签,并将文字颜色设为蓝色。 类选择器 选择带有特定类名的元素,类名前加 .。 .container {margin: 20px; }选择类名为 container 的所有元素。 ID 选择器 选…...
Linux使用Dockerfile部署Tomcat以及jdk
资源准备 首先提供本教程所有资源包。 当然也可以根据自己需求去官网下载。 链接:百度网盘 请输入提取码 提取码:f31y #我们开始吧 首先我们需要一台linux操作系统的机器,当然windows也是可以的,本系列教程是基于Linux的&#…...
LC20. 有效的括号
用来熟悉一下栈的应用之括号匹配 题目链接 下面是大致思路 1.初始化:创建一个空栈,用于存储左括号。(LC这题不用,自己写完整的需要) 2.遍历字符串:从左到右依次扫描字符串中的每个字符。 3.处理左括号:如果是左括号,将其压入栈中。 4.处理右…...
基于springboot企业微信SCRM管理系统源码带本地搭建教程
系统是前后端分离的架构,前端使用Vue2,后端使用SpringBoot2。 技术框架:SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境:jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…...
【MTMSA】不确定缺失模态下基于情态翻译的多模态情感分析
MTMSA是基于TATE改进的,大致框架都和他一样,区别在于MTMSA没有提到tag,并且在多头注意力的部分进行了改进,也就是文中模态翻译模块,此外还加了两个损失函数。在TATE中有一章是不同设置的影响,里面有多个证明…...
【php常用公共函数】php获取指定时间段中有那几年并输出年份的起始时间和结束时间
php获取指定时间段中有那几年并输出年份的起始时间和结束时间 实现思路实现代码输出结果 实现思路 解析输入的时间:将输入的时间字符串转换为DateTime对象。计算年份范围:从开始年份到结束年份,生成一个包含所有年份的数组。输出年份的起始和…...
CTF-PWN: 什么是_IO_FILE?
重要概念:fopen()返回的是一个结构体的指针 _IO_FILE 结构体在什么时候被创建? _IO_FILE 结构体的实例是在程序使用标准 I/O 函数(如 fopen、fclose、fread、fwrite 等)时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理…...
前端八股文第二篇
11.事件循环 事件循环(Event Loop)是 JavaScript 运行时中的一种机制,用于处理异步操作和事件驱动的编程。在浏览器环境中,事件循环是指浏览器通过事件队列(Event Queue)来管理和调度异步任务的执行顺序。…...
springboot汽车保修服务管理系统-计算机毕业设计源码00052
摘 要 随着汽车数量的不断增加和汽车保修服务需求的日益增长,建立一套高效的汽车保修服务管理系统变得至关重要。基于Spring Boot框架的汽车保修服务管理系统旨在整合汽车保修流程,简化管理流程,提高服务质量和用户体验未来,我们将…...
分布式架构搭建博客网站
目录 运行环境基础配置需求准备工作配置静态ip修改主机名及host映射开启防火墙时间同步配置免密ssh登录 环境搭建Server-Web端安装LNMP环境软件Server-NFS-DNS端上传博客软件Server-NFS-DNS端设置NFS共享Server-Web设置挂载远程共享目录nginx设置在数据库中创建数据库和用户重启…...
python-opencv给图片或视频去水印
文章目录 引言inpaint函数的使用方法鼠标事件回调函数cv2.setMouseCallback介绍去水印步骤实现代码 引言 本文主要基于cv2.inpaint函数实现图片的水印去除。 inpaint函数基于图像修复算法,通过对缺陷区域周围像素的分析和插值,生成合适的像素值来填充缺…...
免费送源码:Java+ssm+Springboot Springboot手办定制销售系统 计算机毕业设计原创定制
Springboot手办定制销售系统 摘 要 随着人们生活水平的提高和互联网的发展,人们消费思想和消费方式的逐渐改变,使得消费者开始追求自身品味和个性。手办定制就是在这种条件下应运而生。手办定制是基于客户需求来定制产品,满足客户对其功能、结…...
卡夫卡的使用
关于消息队列的使用 一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveM…...
mac|maven项目在idea中连接redis
安装maven brew install maven idea-setting导入redis插件 idea新建maven项目 构建系统选择maven 项目右侧数据库图标导入redis 新建一个数据库,名称必须为数字,测试一下是否可以连接,连接成功后选择确定 pom.xml导入redis <depende…...
Python基础学习------第一天
print("hello world") 1.括号和引号,必须使用的是英文 被双引号包围起来的称为字符串。 python注释:单行注释:1.井号# 2.多行注释 :""" """ print输出多个内容是中间用逗号隔开就好…...
MySQL的SQL语句之触发器和存储过程的应用
触发器 Trigger 一.触发器 作用:当检测到某种数据表发生数据变化时,自动执行操作,保证数据的完整性。 1.创建一个触发器 如上图所示,查看这个create的帮助信息的时候,这个create trigger就是创建触发器的意思。 如…...
网站建设 网页设计需要技能/南京百度seo排名
2019独角兽企业重金招聘Python工程师标准>>> 开启防火墙端口 firewall-cmd --zonepublic --add-port21/tcp --permanent firewall-cmd --zonepublic --add-port10060-10090/tcp --permanent 重启防火墙 systemctl restart firewalld.service 关闭selinux vi /etc/se…...
nft制作网站/电商平台排行榜
这是因为中国的企业都没有长远的规划,或者说它们都不知道自己能生存多长时间,如此情况下谁会愿意冒险去尝试新的东西,即使是深圳科技企业其实同样不愿意尝试新的东西,你看它先后进入的手机、PC、服务器、云计算,哪个是它开拓出来的…...
河南省建设信息管理协会/seog
ORACLE下删除当前用户下所有对象的SQLSql代码--删除某个用户下的对象set heading off;set feedback off;spool c:\dropobj.sql;prompt --Drop constraintselect alter table ||table_name|| drop constraint ||constraint_name|| ; from user_constraints where constraint_typ…...
钦州做网站的公司/second是什么意思
一篇奇文出现在某匿名社交软件,引起了大家对文豪的赞口不绝。先发原图:再转原文:发现邻居大部分都是程序员,一开始我还挺高兴,觉得都是高素质的人,环境会很好。但是出事了就发现一个个的特别不靠谱这几天我…...
网站代发怎么做/中国免费域名注册平台
橡皮擦,一个逗趣的互联网高级网虫。 上一篇博客抽奖公布 上一篇博客,我们设置了抽奖环节,恭喜 m0_58026795,抓紧联系擦姐吧。 以后爬虫 120 例每篇文章,只要评论超过50,我们就进行一轮评论抽奖。 coser 美图,用 Python 给她续上,再爬 2000 张 上一篇文章中有朋友说,…...
做类似淘宝的网站设计需要什么/英文seo是什么
一、Timestamp类封装 class Timestamp: public muduo::copyable,public boost::less_than_comparable<Timestamp>类图如下: 值语义:可以拷贝,拷贝之后,与原对象脱离关系 对象语义:要么是不能拷贝;要么…...