当前位置: 首页 > news >正文

最详细STM32,cubeMX串口发送,接收数据

这篇文章将详细介绍 串口 发送数据,接受数据。

文章目录

  • 前言
  • 一、串口的基础知识
  • 二、cubeMX 配置
  • 三、自动生成代码解析
  • 四、串口发送数据函数
  • 五、使用串口收发数据点亮 led
      • 重定向函数:
  • 总结


前言

  • 实验开发板:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。
  • 实验:串口发送数据点亮 led。

一、串口的基础知识

如果想了解串口的基础知识可以参考我之前的文章:
STM32Cube串口USART发送接收数据
STM32CubeMX串口USART中断发送接收数据

二、cubeMX 配置

  1. 选择芯片,开始创建工程。
    在这里插入图片描述
  2. 设置 仿真。
    在这里插入图片描述
  3. 配置时钟,选择 HSE, 高速时钟。
    在这里插入图片描述
  4. 设置时钟频率。
    直接设置为 最大频率 72 ,然后双击 enter 即可。
    在这里插入图片描述
  5. 设置工程的名字,工具链选择 MDK。
    在这里插入图片描述
  6. 点击自动生成 .c / .h 文件。
    在这里插入图片描述
  7. 这里我使用串口2 ,USART2。然后选择异步模式。
    对于 USART2 可以是 同步也可以是异步。而 UART 只可以是 同步。
    在这里插入图片描述
  8. 点击 NVIC, 使能中断。在这里插入图片描述
  9. 设置 相关参数(波特率,数据长度,校验位,停止位)
    在这里插入图片描述
  10. 可以看到这里出现了两个 PA2, PA3 引脚,分别是 发送引脚,接收引脚。
    在这里插入图片描述
  11. 点击生成即可。
    这样就可以生成 keil 的工程文件。
    在这里插入图片描述

三、自动生成代码解析

使用 cubeMX 生成的 串口代码都放在 usart.c 中。

  1. 首先还是 先定义一个 串口对象,这是一个结构体。

  2. 初始化这个结构体中的相关参数。然后调用 HAL_UART_Init(&huart2) 对其初始化。

  3. 之后自动调转到HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) 执行。

  4. __HAL_RCC_USART2_CLK_ENABLE(); 开启串口 2
    由于 PA2, PA3 引脚,所以使用 __HAL_RCC_GPIOA_CLK_ENABLE();使能 gpio 端口。

  5. 配置引脚:
    这里 PA2 作为复用引脚(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是GPIO_MODE_AF_PP复用推挽输出。

  6. HAL_NVIC_SetPriority(USART2_IRQn, 0, 0) 设置优先级
    HAL_NVIC_EnableIRQ(USART2_IRQn); 使能中断

在这里插入图片描述
在这里插入图片描述

四、串口发送数据函数

  1. 发送数据。串口发送数据有 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)
  1. 接收数据。
  • 开启串口中断接收函数:
    每次接收到数据后,都要再次开启中断接收函数。这样才可以多次接收数据
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。所需软件&#xf…...

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∑Nclass​​P(xi​)log2​P(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" //调用打印函…...

构建企业级AI智能体:LangGraph多智能体框架实战指南

构建企业级AI智能体:LangGraph多智能体框架实战指南 【免费下载链接】langgraph Build resilient language agents as graphs. 项目地址: https://gitcode.com/GitHub_Trending/la/langgraph 在当今AI应用开发中,开发者面临着一个核心挑战&#x…...

SEO_本地中小企业快速见效的SEO操作指南(345 )

SEO:本地中小企业快速见效的SEO操作指南 在当今数字化时代,本地中小企业如何在竞争激烈的市场中脱颖而出,是每一个企业主都需要面对的问题。本文将从多个角度为你详细解析如何通过SEO(搜索引擎优化)让本地中小企业迅速见效。 问…...

DFRobot URM07超声波传感器UART通信与温度补偿详解

1. DFRobot URM07超声波测距传感器技术深度解析1.1 产品定位与工程价值DFRobot URM07(SKU: SEN0153)是一款面向嵌入式系统设计的工业级超声波距离传感器模块,其核心价值在于将高精度测距、环境温度补偿、超低功耗与UART标准化接口四者深度融合…...

BiliTools:B站资源高效管理与下载完全指南

BiliTools:B站资源高效管理与下载完全指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools是一…...

103. ancher WebSocket 与 NGINX OSS 入口控制器的故障

Environment 环境 SUSE Rancher 2.10.3AWS EKS cluster AWS EKS 集群NGINX OSS Ingress Controller (oci://ghcr.io/nginx/charts/nginx-ingress) NGINX OSS 入口控制器(oci:// ghcr.io/nginx/charts/nginx-ingress) Situation 地理位置 After upgrad…...

DeOldify开发者效率提升:10分钟集成到现有Flask/Django项目中

DeOldify开发者效率提升:10分钟集成到现有Flask/Django项目中 1. 项目简介 你是不是遇到过这样的场景:客户想要一个黑白照片上色的功能,但你完全不懂深度学习?或者想要给老照片修复应用添加AI能力,却被复杂的模型部署…...

基于S7-200 PLC与组态王技术的温室大棚控制方案:包含梯形图原理图、IO分配及组态画面详解

基于S7-200 PLC和组态王温室大棚控制 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面菜农张叔上周还给我打电话吐槽:“小王啊,上周那场降温加突然转晴,我三点爬起来盖半层棉被…...

AI图像增强工具Real-ESRGAN-GUI:让模糊影像重获新生的完整指南

AI图像增强工具Real-ESRGAN-GUI:让模糊影像重获新生的完整指南 【免费下载链接】Real-ESRGAN-GUI Lovely Real-ESRGAN / Real-CUGAN GUI Wrapper 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN-GUI 你是否曾遇到珍藏的老照片因年代久远变得模糊不…...

双向充放电前馈控制:储能变流器PCS_PWM变流器的SVPWM调制与实现

【复现】储能变流器PCS_PWM变流器双向充放电前馈控制SVPWM调制 1、电路构成:三相电网、三相 PWM变流器、Buck/Boost 变换器和蓄电池 2、三相变流器控制:采用电压外环、电流内环双闭环PI 控制,电网电压和电容电流前馈,电感电流解耦…...

推荐算法闲谈:如何在不同业务场景下理解和拆解核心指标

巧解决的是能不能学好,而指标分析解决的是这次改动是否真正创造了业务价值,以及为什么。一个非常常见、但又极易被忽视的事实是:推荐系统并不存在一套放之四海而皆准的核心业务指标。不同产品形态、不同交互方式、不同公司发展阶段&#xff0…...