STM32CubeIDE(CUBE-MX hal库)----串口通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、CUBE-MX可视化配置
  • 二、发送数据和接收数据
    • 1.HAL库串口的阻塞模式和非阻塞模式
    • 2.HAL库串口阻塞模式数据发送函数
    • 3.HAL库串口阻塞模式数据接收函数
    • 4.HAL库串口非阻塞模式数据发送函数
    • 5.HAL库串口非阻塞模式数据接收函数
    • 6.HAL库串口处理流程和标准库函数的处理流程对比
  • 三、接收不定长数据以及DMA数据的发送和接收
  • 四、printf重定向


前言

本文讲述了利用HAL库进行串口数据的发送和接收


提示:以下是本篇文章正文内容,下面案例可供参考

一、CUBE-MX可视化配置

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、发送数据和接收数据

1.HAL库串口的阻塞模式和非阻塞模式

阻塞模式:
在阻塞模式下,发送和接收函数会一直等待直到数据发送或接收完成。在HAL库中,一些典型的阻塞模式的串口操作函数有:
发送数据:HAL_UART_Transmit 或 HAL_UART_Transmit_DMA。
接收数据:HAL_UART_Receive 或 HAL_UART_Receive_DMA。
这些函数会一直阻塞程序的执行,直到数据完全发送或接收
非阻塞模式:
在非阻塞模式下,发送和接收函数是非阻塞的,它们会立即返回,允许程序在等待数据传输的同时执行其他任务。在HAL库中,使用的是带有IT(中断)或DMA(直接存储器访问)的函数。
发送数据:HAL_UART_Transmit_IT、HAL_UART_Transmit_DMA等。
接收数据:HAL_UART_Receive_IT、HAL_UART_Receive_DMA等。
两种方式的优缺点:
阻塞模式简单直观,但可能导致程序在等待数据时无法执行其他任务。非阻塞模式可以提高系统的响应性,但需要更复杂的程序设计,以处理异步的数据传输。

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);//非阻塞方式发送数据
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

2.HAL库串口阻塞模式数据发送函数

实现了每隔500ms向串口发送一个字符串hello world
在这里插入图片描述
HAL_UART_Transmit函数解析

函数:HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
入口参数:UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1,注意的是传入的是地址例如:&huart1
*pData 需要发送的数据
Size 发送的字节数
Timeout 最大发送时间,发送数据超过该时间退出发送
返回值: HAL_OK = 0x00U,
HAL_ERROR = 0x01U,
HAL_BUSY = 0x02U,
HAL_TIMEOUT = 0x03U
功能:发送一字节数据

3.HAL库串口阻塞模式数据接收函数

实现了将串口发送的数据进行接收,存放到receiveData中,并利用HAL_UART_Transmit()将接收到的数据发送到串口
在这里插入图片描述
HAL_UART_Receive函数解析

函数:HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数:同HAL_UART_Transmit()函数一样,这个函数也有四个参数
第一个参数是要使用的串口句柄地址,比如要使用U(S)ART1,参数就设置为U(S)ART1的句柄地址&huart1
第二个参数是接受数据的缓冲区首地址
第三个参数是接受的数据长度,这里可以直接用sizeof()函数获取接受缓冲区的长度
第四个参数是超时时间,单位是ms,如果超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY,处理器就会一直等到接受到设置好的数据数量再执行下一条语句。
返回值: HAL_OK = 0x00U,
HAL_ERROR = 0x01U,
HAL_BUSY = 0x02U,
HAL_TIMEOUT = 0x03U
功能:接收数据

4.HAL库串口非阻塞模式数据发送函数

首先要使能中断
在这里插入图片描述

函数:HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数:前三个参数和阻塞方式完全一致,为什么没有超时时间了呢?因为中断(IT)方式配置完成寄存器之后不需要再占用CPU,会在接受完成后触发中断。

5.HAL库串口非阻塞模式数据接收函数

在这里插入图片描述
重写HAL_UART_RxCpltCallback回调函数,接收数据完成后将数据以非阻塞方式进行发送
在这里插入图片描述
实现效果,注意再发送数据后想要再次接收数据要再次使用HAL_UART_Receive_IT(&huart1, receiveData, 2);
在这里插入图片描述

6.HAL库串口处理流程和标准库函数的处理流程对比

MX_USART1_UART_Init(); 对应 USART_Config();NVIC_Configuration();
HAL_UART_Init(&huart1) 对应 USART_Init(DEBUG_USARTx, &USART_InitStructure)
HAL_UART_Receive_IT(&huart1, (uint8_t *)Buffer, 1); 对应 USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);

在看HAL库代码时疑问点是在开启HAL_UART_Receive_IT()非阻塞接收数据,具体实现的源代码在哪里?
首先在使用标准库时,一般直接在某个串口的中断服务函数中利用USART_ReceiveData整个库函数来接收数据。

void USART1_IRQHandler(void)   
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
		Res =USART_ReceiveData(USART1);
	}
}

而在HAL库中开发者不用再写f(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)判断寄存器的状态了,因为HAL_UART_IRQHandler(&huart1);这个函数已经帮你写好了。在这里插入图片描述
点进HAL_UART_IRQHandler(&huart1);这里面HAL库已经帮你写了判断寄存器值的函数这里相当于if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
在这里插入图片描述
点进去UART_Receive_IT这里面实现的功能和标准库函数中的USART_ReceiveData实现功能是一样的
在这里插入图片描述
这里是标准库函数中的USART_ReceiveData(),经过比较可以看出HAL库将底层对寄存器的操作进行了封装因此用户可以更加方便的使用HAL库函数

uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}

在这里插入图片描述

三、接收不定长数据以及DMA数据的发送和接收

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  /* Prevent unused argument(s) compilation warning */
	if(huart==&huart1)
	{
//		HAL_UART_Transmit_DMA(&huart1, receiveData, Size);
//		HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
		HAL_UART_Transmit_IT(&huart1, receiveData, Size);
		HAL_UARTEx_ReceiveToIdle_IT(&huart1, receiveData, sizeof(receiveData));
	}


  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UARTEx_RxEventCallback can be implemented in the user file.
   */
}

在这里插入图片描述
利用DMA进行数据的传输

在这里插入图片描述

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  /* Prevent unused argument(s) compilation warning */
	if(huart==&huart1)
	{
		HAL_UART_Transmit_DMA(&huart1, receiveData, Size);
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));
		//HAL_UART_Transmit_IT(&huart1, receiveData, Size);
		//HAL_UARTEx_ReceiveToIdle_IT(&huart1, receiveData, sizeof(receiveData));
	}


  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UARTEx_RxEventCallback can be implemented in the user file.
   */
}

四、printf重定向

1.在main函数前面加上以下代码

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//STM32cubeIDE下
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1,0xFFFF);
    return ch;
}

//keil下 //没在keil下尝试过 一直使用软件stm32cubeIDE没有取keil验证
//UART_HandleTypeDef huart1; //UART句柄
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);
	return ch;
}

2.在CUBEIDE中按照图中所示修改
在这里插入图片描述在这里插入图片描述
实现效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pygame直线绘制

文章目录 lines光线反射 pygame.draw中有4个绘制直线的函数,列表如下 一条线段多条线段正常linelines抗锯齿aalineaalines 一条和多条线段的输入参数如下 line(surface, color, start_pos, end_pos, width1)lines(surface, color, closed, points, width1) line…

搭建Appium工具环境

1、安装Java Development Kit(JDK) 前往Oracle官网下载JDK。 在https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 找到最新版本的JDK。根据操作系统选择适合的版本,并根据指示下载安装程序。 安装JDK。运行下载的安…

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看,或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家,有需要的可是尝试下,小编这边测试了可以用,就是下载的时候慢的一匹。。。 第一…

计算机网络——数据链路层-数据链路层概述(介绍、三个重要问题、使用广播信道的数据链路层、其他问题)

目录 介绍 三个重要问题 封装成帧 差错检测 可靠传输 使用广播信道的数据链路层 其他问题 介绍 本篇对数据链路层进行概述,我们首先来看看数据链路层在网络体系结构中的地位: 主机H1给主机H2发送数据,中间要经过三个路由器和电话网、…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。(由于只在本机进行连接,所以没有选择桥接模式。当然,桥接模式的配置会…

Ubuntu 22.03 LTS 安装deepin-terminal 实现 终端 分屏

deepin-terminal 安装 源里面自带了这个软件,可以直接装 sudo apt install deepin-terminal 启动 按下Win键,输入deep即可快速检索出图标,点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口&#xff0…

33 - MySQL调优之索引:索引的失效与优化

不知道你是否跟我有过同样的经历,那就是作为一个开发工程师,经常被 DBA 叫过去“批评”,而最常见的就是申请创建新的索引或发现慢 SQL 日志了。 记得之前有一次迭代一个业务模块的开发,涉及到了一个新的查询业务,需要…

考试周刊杂志考试周刊杂志社考试周刊编辑部2023年第46期目录

教育教学研究 丰富作业形式 拓展课堂教学——“双减”下初中英语优化作业设计探析 王慧; 1-5 博学慎思明辨 撬动思维杠杆——论“思辨性阅读与表达”学习任务群范式构建 丁亚琴; 6-10《考试周刊》投稿邮箱:cn7kantougao163.com(注明投稿“《考试周刊》”) 崔…

Leetcode—35.搜索插入位置【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—35.搜索插入位置 实现代码 int lower_bound(int* arr, int numsSize, int tar) {int left 0, right numsSize;int mid;// 左闭右开[left, right)while(left < right) {mid left (right - left) / 2;if(arr[mid] &…

企业网络中的身份安全

随着近年来数字化转型的快速发展&#xff0c;企业使用的数字身份数量急剧增长。身份不再仅仅局限于用户。它们现在扩展到设备、应用程序、机器人、第三方供应商和组织中员工以外的其他实体。即使在用户之间&#xff0c;也存在不同类型的身份&#xff0c;例如属于IT管理员、远程…

vue3+ts 指令拖拽案例

<template><div class"box" v-move><div class"header"></div><div>内容</div></div> </template><script setup lang"ts"> import { ref, Directive, DirectiveBinding } from "vu…

【EasyExcel】导出excel并支持自定义设置数据行背景颜色等

需求背景&#xff1a; 根据查询条件将列表数据导出&#xff0c;并筛选出满足某个条件的数据&#xff0c;将满足条件的数据的背景颜色设置成黄色。 &#xff08;本文例子如&#xff1a;name出现的次数大于等于2&#xff0c;将相关数据背景颜色都设置为黄色&#xff09; …

智慧工厂人员定位系统源码,融合位置物联网、GIS可视化等技术,实现对人员、物资精确定位管理

智慧工厂人员定位系统源码&#xff0c;UWB高精度定位系统源码 随着中国经济发展进入新常态&#xff0c;在资源和环境约束不断强化的背景下&#xff0c;创新驱动传统制造向智能制造转型升级&#xff0c;越发成为企业生存发展的关键。智能工厂作为实现智能制造的重要载体&#xf…

[操作系统]京东一面~进程相关汇总

1 进程、线程、协程的概念 进程&#xff1a; 静态程序的运行状态就叫进程。是资源分配的基本单位。 线程&#xff1a; 是进程的一个执行单元&#xff0c;是进程内的调度实体。是CPU调度的独立单位。线程也被称为轻量级进程。 协程&#xff1a; 是一种比线程更加轻量级的存在。…

多线程04 死锁,线程可见性

前言 前面我们讲到了简单的线程安全问题以及简单的解决策略 其根本原因是cpu底层对线程的抢占式调度策略,随机调度 其他还有一些场景的问题如下 1.多个线程同时修改一个变量问题 2.执行的操作指令本身不是原子的 比如自增操作就分为三步,加载,自增,保存 3.内存可见性问题 4.指令…

cesium不同版本对3dtiles的渲染效果不同,固定光照的优化方案

cesium不同版本对3dtiles的渲染效果不同&#xff0c;固定光照的优化方案&#xff0c;避免map.fixedLight true,导致的光照效果太强&#xff0c;模型太亮的问题。 问题来源&#xff1a; 1.Cesium1.47版本加载tileset.json文件跟Mars3d最新版加载文件存在差异效果 Cesium1.47…

小航助学题库蓝桥杯题库stem选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

ESP32-Web-Server编程-建立第一个网页

ESP32-Web-Server编程-建立第一个网页 HTTP 简述 可能你每天都要刷几个短视频&#xff0c;打开几个网页来娱乐一番。当你打开一个网络上的视频或者图片时&#xff0c;其实际发生了下面的流程&#xff1a; 其中客户端就是你的浏览器啦&#xff0c;服务器就是远程一个存放视频或…

openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项

文章目录 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项133.1 检查openGauss状态133.2 检查锁信息133.3 统计事件数据133.4 对象检查133.5 SQL报告检查133.6 备份133.7 基本信息检查 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项 …

系列二十二、各种注解

一、Import # 用法 1&#xff09;Import(User.class)&#xff1a;如果导入的是配置类&#xff0c;将会按照配置类正常解析&#xff0c;如果是个普通类就会解析成bean 2&#xff09;Import&#xff08;实现了ImportSelector接口的类.class&#xff09;&#xff1a;可以一次性注册…