最详细STM32,cubeMX串口发送,接收数据
这篇文章将详细介绍 串口 发送数据,接受数据。
文章目录
- 前言
- 一、串口的基础知识
- 二、cubeMX 配置
- 三、自动生成代码解析
- 四、串口发送数据函数
- 五、使用串口收发数据点亮 led
- 重定向函数:
- 总结
前言
- 实验开发板:STM32F103C8T6。
- 所需软件:keil5 , cubeMX 。
- 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。
- 实验:串口发送数据点亮 led。
一、串口的基础知识
如果想了解串口的基础知识可以参考我之前的文章:
STM32Cube串口USART发送接收数据
STM32CubeMX串口USART中断发送接收数据
二、cubeMX 配置
- 选择芯片,开始创建工程。
- 设置 仿真。
- 配置时钟,选择 HSE, 高速时钟。
- 设置时钟频率。
直接设置为 最大频率 72 ,然后双击 enter 即可。
- 设置工程的名字,工具链选择 MDK。
- 点击自动生成 .c / .h 文件。
- 这里我使用串口2 ,USART2。然后选择异步模式。
对于 USART2 可以是 同步也可以是异步。而 UART 只可以是 同步。
- 点击 NVIC, 使能中断。
- 设置 相关参数(波特率,数据长度,校验位,停止位)
- 可以看到这里出现了两个 PA2, PA3 引脚,分别是 发送引脚,接收引脚。
- 点击生成即可。
这样就可以生成 keil 的工程文件。
三、自动生成代码解析
使用 cubeMX 生成的 串口代码都放在 usart.c 中。
-
首先还是 先定义一个 串口对象,这是一个结构体。
-
初始化这个结构体中的相关参数。然后调用
HAL_UART_Init(&huart2)
对其初始化。 -
之后自动调转到
HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
执行。 -
__HAL_RCC_USART2_CLK_ENABLE()
; 开启串口 2
由于 PA2, PA3 引脚,所以使用__HAL_RCC_GPIOA_CLK_ENABLE();
使能 gpio 端口。 -
配置引脚:
这里 PA2 作为复用引脚(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是GPIO_MODE_AF_PP复用推挽输出。 -
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0)
设置优先级
HAL_NVIC_EnableIRQ(USART2_IRQn);
使能中断
四、串口发送数据函数
- 发送数据。串口发送数据有 2 种写法。(有无中断)
这里我主要介绍最后一个参数 超时时间 Timeout 。 当使用这个函数 发送数据时,如果超过该时间,则直接返回错误,不再执行该函数。
HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
以中断的方式发送数据。这里就不需要超时时间了。
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
- 接收数据。
- 开启串口中断接收函数:
每次接收到数据后,都要再次开启中断接收函数。这样才可以多次接收数据。
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
- 串口中断接收回调函数:
当接收到数据时,就会调用该函数。
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
五、使用串口收发数据点亮 led
这里如果要点亮 led ,要在cubeMX 中配置 led 引脚。
uint8_t rx_buff = 0; // 存放接收的数据/* 每次接收到数据后都会调用该串口回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart2){if(rx_buff == 0xa1) // 发送 a1 点亮 led{printf("LED ON\r\n"); // 使用 printf 发送数据,需重定向 fputc 函数HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);}else if(rx_buff == 0xa2) // 发送 a2 熄灭 led{printf("LED OFF\r\n");HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);}}HAL_UART_Receive_IT(&huart2,&rx_buff,1); // 再次开启接收
}
重定向函数:
发送数据,可使用 printf 。
由于 printf 依赖于 fputc 函数
,所以可以重定向 fputc 来实现 printf 串口发送数据。
int fputc(int ch, FILE* f)
{while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch)-1,300) != HAL_OK);return 0;
}
接收数据可以使用 scanf 。
int fgetc( FILE *f) /* scanf 输入 */
{char c = 0;while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);return c;
}
总结
下一篇文章为大家介绍 STM32 超声波 模块的使用。
相关文章:

最详细STM32,cubeMX串口发送,接收数据
这篇文章将详细介绍 串口 发送数据,接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数: 总结 前言 实验开发板:STM32F103C8T6。所需软件…...

Kafka入门04——原理分析
目录 01理解Topic和Partition Topic(主题) Partition(分区) 02理解消息分发 消息发送到分区 消费者订阅和消费指定分区 总结 03再均衡(rebalance) 再均衡的触发 分区分配策略 RangeAssignor(范围分区) RoundRobinAssignor(轮询分区) StickyAssignor(粘性分区) Re…...

k8s-----17、集群安全机制
1、集群安全机制概述 1.1 访问k8s的三个步骤 1、认证 2、鉴权(授权) 3、准入控制 进行访问的时候,过程中都需要经过apiserver,apiserver做统一协调,比如门卫。且访问过程中需要证书、token、或者用户名密码。如果需要访问pod,…...

蓝桥算法赛(铺地板)
问题描述 小蓝家要装修了,小蓝爸爸买来了很多块(你可以理解为数量无限) 23 规格的地砖,小蓝家的地板是 nm 规格的,小蓝想问你,能否用这些 23 的地砖铺满地板。 铺满地板:对于地板的每个区域&…...

浅谈AcrelEMS-GYM文体建筑能效管理解决方案-安科瑞 蒋静
1 概述 AcrelEMS-CA 文体建筑能效管理聚焦建筑的能量和信息的流向搭建平台解决方案。该系统解决方案集变电站综合自动化、电力监控、电能质量分析及治理、电气安全、能耗分析、照明控制、设备运维于一体。打破子系统孤立,配置方便,运维便捷;…...
在LayerUI中使用onChange事件监听复选框的值变化
在LayerUI中,你可以使用onChange事件监听复选框的值变化。当复选框的状态发生变化时,onChange事件会被触发。 以下是一个示例代码,演示了如何使用onChange事件监听复选框的值变化: jsx import React from react; import { Chec…...
决策树--ID3算法
决策树–ID3算法 概念 (1)信息熵 E n t r o p y ( x ) − ∑ i N c l a s s P ( x i ) l o g 2 P ( x i ) Entropy(x) -\sum_{i}^{N_{class}}P(x_i)log_2 P(x_i) Entropy(x)−i∑NclassP(xi)log2P(xi) 假设只有2个类别(N2&…...

js延时加载有哪些方式
...
VSCode运行python提示No module name ‘xxx‘
在进行from * import *导入操作时,编辑器能够解析到module, 但是在编辑器中运行时确提示。 No module name xxx 而且单独运行该文件,或在其他编辑器、或terminal中python file运行,都能正常导入module. 解决方案: 在vscode的用…...

【网安大模型专题10.19】※论文5:ChatGPT+漏洞定位+补丁生成+补丁验证+APR方法+ChatRepair+不同修复场景+修复效果(韦恩图展示)
Keep the Conversation Going: Fixing 162 out of 337 bugs for $0.42 each using ChatGPT 写在最前面背景介绍自动程序修复流程Process of APR (automated program repair)1、漏洞程序2、漏洞定位模块3、补丁生成4、补丁验证 (可以学习的PPT设计)经典的…...

C盘满了怎么清理文件?
电脑的C盘是我们电脑存储系统文件和应用程序的一个重要盘符,很多人经常会遇到C盘空间不足的问题;虽然我们可以通过卸载程序或者删除文件来释放空间,但是在这个过程中往往会误删掉一些重要的文件,造成部分程序可能无法正常使用。 因…...
pytest方法间变量值传递--request夹具
相当于self对象,因为调试的时候测试用例是类似沙箱的单步运行,所以self对象的属性被阻挡在沙箱外边。 request.cls 是pytest中的一个属性,它允许您在测试类中共享数据或属性。当您使用pytest编写测试类时,request 夹具允许您在测…...
Linux 内核定时器(高级字符设备五)
一、Linux 内核定时器介绍 在 Linux 内核中很多函数是基于定时器进行驱动的,但是内核定时器的精度并不高,所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性,到达计时终点后会自动关闭。如果要实现周期性定时,就要在…...

「快学Docker」Docker镜像和容器的创建与管理
「快学Docker」Docker镜像和容器的创建与管理 引言什么是Docker镜像?镜像获取和使用镜像获取镜像使用 什么是Docker容器?Docker容器与主机之间的交互基于Dockerfile创建镜像基于镜像创建容器总结 引言 Docker镜像和容器是当今云计算领域中最受欢迎的技术…...

Zabbix出现 404Not FoundThe requested URL /zabbix was not found on this server.
目录 一、问题: 二、原因: 三、解决方法: 一、问题: Not Found The requested URL /zabbix was not found on this server. 二、原因: 未找到 在此服务器上找不到请求的 URL /zabbix。 /etc/httpd/conf.d 目录…...

【STM32】标准库的引入
一、为什么要会有标志外设库 1、传统单片机软件开发方式 (1)芯片厂商提供数据手册、示例代码、开发环境 (2)单片机软件工程师面向产品功能,查阅数据手册,参考官方示例代码进行开发 (3)硬件操作的方式是用C语言对寄存器进行读写以操作硬件 (4)主要工作量…...
Redis的淘汰策略
Redis是一种基于内存的高性能键值存储数据库,由于内存资源有限,当Redis中的数据量增大时,会导致内存占用过多,可能会影响系统的性能和稳定性。为了解决这个问题,Redis提供了一些淘汰策略来自动清理不再使用的key&#…...

Linux友人帐之日志与备份
一、日志 1.1概述 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说也很重要,它记录了系统每天发生的各种事情&#…...
git中如何在父仓库提交子仓库的修改
子仓库在父仓库中进行了修改,你需要按照以下步骤提交子仓库的修改: 切换到子仓库目录:使用cd命令进入子仓库所在的目录。拉取子仓库的最新更改:使用git pull命令拉取子仓库的最新更改,确保你的本地是最新的版本。提交…...
【【萌新的SOC学习之SD卡DMA回路读写大数据的实验】】
萌新的SOC学习之SD卡读写大数据的实验 记得先设定 FIFO 的位宽和深度 还有DMA 的大小 其他基本结构设计参照上一个SD卡读写小数据的实验 #include "xparameters.h" //包含vivado所导出的信息包含vivado的基地址 #include "xil_printf.h" //调用打印函…...

全流程开源!高德3D贴图生成系统,白模一键生成真实感纹理贴图
导读 MVPainter 随着3D生成从几何建模迈向真实感还原,贴图质量正逐渐成为决定3D资产视觉表现的核心因素。我们团队自研的MVPainter系统,作为业内首个全流程开源的3D贴图生成方案,仅需一张参考图与任意白模,即可自动生成对齐精确…...

手机号段数据库与网络安全应用
手机号段数据库的构成与原理 手机号段数据库存储着海量手机号段及其关联信息,包括号段起始与结束号码、运营商归属、地区编码、卡类型等核心数据。这些数据主要来源于通信管理机构的官方分配信息、运营商的业务更新数据以及合法采集的使用数据。经过数据清洗、校验…...

【uniapp开发】picker组件的使用
项目uniapp,结合fastadmin后端开发 picker组件的官方文档说明 https://en.uniapp.dcloud.io/component/picker.html#普通选择器 先看效果: 1、实现设备类型的筛选;2、实现设备状态的筛选; 前端代码(节选࿰…...

IDEA 打开文件乱码
问题:文件乱码 底部编码无法切换 解决方案: 第一步 使用Nodepad 查询文件编码 本项目设置为 转为 UTF-8 无 BOM 第二步:在 IntelliJ IDEA 中:右键点击文件 → File Encoding → 选择目标编码(如 UTF-8) 最…...

AI大模型在测试领域应用案例拆解:AI赋能的软件测试效能跃迁的四大核心引擎(顺丰科技)
导语 5月份QECon深圳大会已经结束,继续更新一下案例拆解,本期是来自顺丰科技。 文末附完整版材料获取方式。 首先来看一下这个案例的核心内容,涵盖了测四用例设计、CI/CD辅助、测试执行、监控预警四大方面,也是算大家比较熟悉的…...

微算法科技(NASDAQ:MLGO)基于信任的集成共识和灰狼优化(GWO)算法,搭建高信任水平的区块链网络
随着数字化转型的加速,区块链技术作为去中心化、透明且不可篡改的数据存储与交换平台,正逐步渗透到金融、供应链管理、物联网等多个领域,探索基于信任的集成共识机制,并结合先进的优化算法来提升区块链网络的信任水平,…...
Docker 容器化基础:镜像、容器与仓库的本质解析
Docker 概念与容器化技术 Docker 是一种容器化平台,能够将应用程序及其依赖项打包成一个容器,确保在任何环境中都能一致运行。容器化技术通过操作系统级别的虚拟化,为应用程序提供了一个独立的运行环境。 容器化技术的核心优势 一致性&…...
在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新
原因:未重新编译UI文件 Qt的UI文件(.ui)需要通过uic工具(Qt的UI编译器)生成对应的ui_*.h头文件。如果你在Qt Designer中修改了对象名,但没有重新构建(Rebuild)…...
极速互联·智控未来——SG-Can(FD)Hub-600 六通道CANFD集线器
工业通信的全维进化,CANFD高速网络的终极枢纽! 核心革新 CANFD协议深度支持:名义波特率5K-1Mbps,数据域速率飙升至5Mbps(较传统CAN提升5倍),开启位速率转换最低100Kbps,完美兼容新旧…...
vue3 按钮级别权限控制
在Vue 3中实现按钮级别的权限控制,可以通过多种方式实现。这里我将介绍几种常见的方法: 方法1:使用Vue 3的Composition API 在Vue 3中,你可以使用Composition API来创建一个可复用的逻辑来处理权限控制。 创建权限控制逻辑 首…...