【蓝桥杯物联网赛项学习日志】Day4 关于USART/UART

news2025/1/13 13:30:09

关键词:USART UART 串口通信

理论基础

USART/UART

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)

通用 同步/异步 串行 接收/发送器是一种串行通信接口。USART最多有5个信号,分别是TX,RX,nCTS.nRTS,SCLK

TX串行输出信号
RX串行输入信号
nCTS(clear to send)允许发送信号,低电平有效,(对方发出)
nRTS(request to send)请求发送信号,低电平有效,(对方发出)
SCLK时钟信号线,仅用于同步模式

TX和RX是必需的,nCTS和nRTS是硬件流控制信号。
在异步通信时可以选择是否使用硬件流控制信号,同步通信时没有硬件流控制信号。
SCLK只用于同步通信,异步通信时无SCLK

USART(Universal Asynchronous Receiver/Transmitter)

通用 异步 串行 接收/发送器 ,只有异步模式,没有SCLK时钟线,一般也没有nCTS,nRTS硬件流控制信号

串口通信的基本参数

数据位8位或9位,一般是八位,每八位一帧数据,刚好1字节
奇偶校验位分为奇校验,偶校验,或者无校验
停止位1或2个停止位,一般设置为1个
波特率串行数据通行速率,单位是bit/s(9600,19200,115200...)

串口配置

串口使用方法

流程

1.时钟使能
2.设置引脚复用器映射
3.GPIO端口模式设置
4.初始化串口参数
5.使能串口

配置步骤

这些步骤都可以在CubeMax里面进行配置。在上一文章中添加配置USART如下
        选择USART2
        mode 选择 (Asynchronous) 异步通信
        Baud Rate 波特率设置为9600
        关闭过载检测
        开启UART中断,配置中断优先级

 

 这样串口就配置好了

示例代码

在UART.C中添加代码

发送代码:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

        huart   串口通道
        pData   发送数据数组
        Size      数据元素的数量
        Timeout 等待时间

接收代码

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

        huart   串口通道
        pData   发送数据数组
        Size      数据元素的数量
        Timeout 等待时间

对串口发送数据和接收数据 代码进行改写

void UART_Transmit(uint8_t *ucData,uint8_t ucSize)
{
	HAL_UART_Transmit(&huart2,ucData,ucSize,100);
}

uint8_t UART_Receive(uint8_t *ucData)
{
	return HAL_UART_Receive(&huart2,ucData,1,0);
}

在UART.h头文件中添加

/* USER CODE BEGIN Prototypes */
void UART_Transmit(uint8_t *ucData,uint8_t ucSize);
uint8_t UART_Receive(uint8_t *ucData);
/* USER CODE END Prototypes */

在主函数中编写功能代码,实现数据的发送与接收

void UART_Proc(void)              	/* UART处理 */
{
  if(ucSec1 != ucSec)
  {                         				/* 1s到 */
    ucSec1 = ucSec;

    UART_Transmit(ucBuf, 4);				/* 发送4个字符 */
    printf(" %04u\r\n", ucSec);			/* 发送秒值和回车换行 */
  }
	
  if(UART_Receive(ucUrx) == 0)			/* 接收到字符 */
  {
    ucUrx[++ucUno] = ucUrx[0];			/* 保存字符 */
    if(ucUno >= 2)
    {																/* 修改秒值 */
      ucSec = (ucUrx[1]-0x30)*10+ucUrx[2]-0x30;
      ucUno = 0;
    }
  }
}

以上代码来自示例代码。

多种发送接受方式以及中断处理

发送数据的方式

//阻塞模式发送数据
HAL_UART_Transmit();
//中断模式发送数据
HAL_UART_Transmit_IT();
//DMA模式发送数据
HAL_UART_Transmit_DMA();

接受数据的方式

//阻塞模式接受数据
HAL_UART_Receivemit();
//中断模式接受数据
HAL_UART_Receivemit_IT();
//DMA模式接受数据
HAL_UART_Receivemit_DMA();

 中断处理

//接受中断处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	uint8_t* rex; 
		if(huart->Instance == USART2)
		{
            //发送接收到的字符数据
			HAL_UART_Receive(huart,rex,sizeof(rex),0); 
			HAL_UART_Transmit(huart,rex,sizeof(rex),10);
			HAL_GPIO_TogglePin(K1_GPIO_Port,K1_Pin);
		}
		__HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
}

//发送中断处理
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	uint8_t* Tra; 
		if(huart->Instance == USART2)
		{
            //中断处理
			
		}
		__HAL_UART_CLEAR_FLAG(&huart2,UART_IT_TC);//清除中断标志位
}

DMA串口传输

*略

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

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

相关文章

SpringBoot整合freemarker模板导出word文件

文章目录1、前言2、需求说明3、编码3.1、导入依赖3.2、接口编写3.3、工具类3.4、ftl文件3.5、测试4、word转pdf5、总结1、前言 在项目中我们有时间需要根据一个word模板文档,批量生成其他的word文档,里面的有些值改变一下而已,那怎么做呢&am…

【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合篇」

承接前文 针对于上一篇【LogbackSpring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」的功能开发指南之后,相信你对于Sl4fj以及Log4j整个生态体系的功能已经有了一定的大致的了解了,接下来我们需要进行介绍关于实现如何将MDC的编程…

家庭实验室系列文章-如何迁移树莓派系统到更大的 SD 卡?

前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔。 因为没有资格,也没有钱在一线城市买房 (😂😂😂); 但是在要结婚之前,婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城…

【面试题】详解Cookie、localStorage、sessionStorage区别

【面试题】详解Cookie、localStorage、sessionStorage区别 三者基本概念 Cookie localStorage sessionStorage 安全性的考虑 Cookie、localStorage、sessionStorage、indexedDB对比 应用场景 Token一般放在哪里??? 放在Cookie 放…

【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表

前言 其实我的数据库启蒙,是在一家甲方公司。 当时一进这家公司,就见到了通过连接数据库自动刷新的excel表。当时学会了这招就一发不可收拾,制作出各种自动刷新的报表。 想象一下,有些高管不喜欢打开各种复杂的业务系统或者报表系…

【JS基础】在js中如何简单的使用正则表达式

文章目录前言创建正则字符类型的匹配方法searchreplacematch正则的匹配方法test转义特殊符号冲突正则创建问题记一些规则符号修饰符原子表[]和原子组()配合转义字符其他字符量词一些实用的正则前言 关于正则表达式的介绍,推荐看这篇文章正则表达式30分钟入门教程&a…

[附源码]java毕业设计商务酒店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

鲁棒无范围定位算法 (RRGA)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LVS-NAT集群搭建

目录 一、环境准备 1、准备三台centos服务器 2、实验拓扑 3、NAT模式介绍 二、LVS-NAT模式部署 1、给lvs服务器安装LVS 2、新建LVS集群 3、添加Real Server服务器节点 4、开启路由转发 5、给后端web服务器配置网关 6、效果测试 一、环境准备 1、准备三台centos服务器…

【C++右值引用】左右值的交叉引用的具体情景,右值详讲

目录 1.右值和左值 2.左值引用和右值引用 3.左右值的交叉引用的具体情景 3.4当不接受返回值就没有办法优化 1.右值和左值 左值与右值是C语言中的概念,但C标准并没有给出严格的区分方式,一般认为:可以放在左边的,或者能 够取地…

基于stm32单片机的光照检测智能台灯

资料编号&#xff1a;101 下面是相关功能视频演示&#xff1a; 101-基于stm32单片机的光照检测智能台灯照明灯Proteus仿真&#xff08;仿真源码全套资料&#xff09;功能介绍&#xff1a; 1、设置为自动模式下&#xff1a;可以检测光照强度&#xff0c;当光照强度<100Lux的…

QT QThread 多线程操作

在QT中&#xff0c;QT应用程序所在的线程为主线程&#xff0c;也称为“GUI线程”&#xff0c;QT GUI必须运行在此线程上&#xff1b;而非主线程称为“工作者线程”&#xff0c;主要处理从主线程中卸下的一些工作&#xff0c;例如数据的同步访问等。需要明确的是&#xff0c;同一…

SSH框架过时了吗?那就最后分享一份阿里架构师整合的SSH框架实战心得吧!

记得当年 java 的企业级框架还是 ssh 的天下&#xff08;spring&#xff0c;struts和hibernate&#xff09;&#xff0c;但是现在感觉 spring 已经完全把那两个框架甩在后边了。用 spring 的人越来越多&#xff0c;用 struts 的人比原来少多了&#xff0c;用 hibernate 的就更少…

BI-SQL丨SNAPSHOT

快照&#xff08;SNAPSHOT&#xff09; 我们在做BI项目的过程&#xff0c;一旦数据涉及到数据库&#xff0c;那么需要考量到的点就比较多。 1.如果数仓是在项目过程中搭建的&#xff0c;那么需要考虑高可用、灾备机制以及安全性问题&#xff1b; 2.如果我们只是需要连接数据库…

Vue3留言墙项目——头部和底部静态页面搭建

文章目录创建项目头部底部创建项目 Vue中使用scss 头部 头部当中有两个按钮&#xff0c;然后根据设计稿可知&#xff0c;本留言墙中有4个按钮&#xff0c;所以可以自己封装一个按钮组件 按钮组件的博客 components/TopNav.vue <template><div class"topNav…

Vue封装一个按钮组件(不使用框架)

做留言墙项目&#xff0c;根据设计稿&#xff0c;发现有四种按钮&#xff0c;这里不使用框架&#xff0c;自己写一个按钮组件 在components下新建MyButton/MyButton.vue <template><button :class"my-btn btn-${type}"><slot></slot></b…

PLC学习笔记(一):概述

如今&#xff0c;电气装置的控制愈发复杂&#xff0c;仅仅依靠低压电器构建逻辑控制电路显得捉襟见肘&#xff0c;而将逻辑控制电路软件化是在满足控制需求前提下降低成本、提高可靠性的重要途经。 那么&#xff0c;我们是选择单片机还是PLC呢&#xff1f;若选择使用单片机&…

嵌入式开发学习之--初识stm32函数库

提示&#xff1a;本篇文章主要以了解为主。 文章目录前言一、库目录及文件简介二、常用资料总结前言 上一篇说到&#xff0c;其实我们不必去直接操作寄存器&#xff0c;也不必自己去写库函数&#xff0c;stm32官方函数库已经满足我们绝大部分的需求了&#xff0c;这一篇文章&a…

逻辑漏洞挖掘

逻辑漏洞# 逻辑漏洞是指由于程序逻辑输入管控不严或者逻辑太复杂&#xff0c;导致程序不能够正常处理或处理错误&#xff0c;逻辑漏洞根据功能需求的不同产生的漏洞方式也不同。一般出现在网站程序的登录注册、密码找回、验证方式、信息查看、交易支付金额等地方。 这类漏洞不…

【第十五章 java反射机制,获取Class类的实例,创建运行时类的对象,调用运行时类中指定的结构】

第十五章 java反射机制&#xff0c;获取Class类的实例&#xff0c;创建运行时类的对象&#xff0c;调用运行时类中指定的结构 1.java反射机制概述 加载完类之后&#xff0c;在堆内存的方法区中就产生了一个Class类型的对象&#xff08;一个类只有一个Class对象&#xff09;&am…