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中按照图中所示修改
在这里插入图片描述在这里插入图片描述
实现效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

氯碱工业盐水精制除钙镁树脂

#氯碱工业盐水精制除钙镁树脂 ​氯碱工业是生产烧碱、氯气、氢气及其衍生产品的基础化工工业之一,在经济发展中具有重要地位,对国防建设和经济具有重要作用。 目前,氯碱工业是采用电解饱和食盐水的方法来制取,无论氯碱工业采用何种…

临近年关,准备好迎接春运了吗?易知微来助力

除夕不放假??!!作为中国传统节日的春节,除夕属于是其中最热闹的时间点之一,虽然对于假期如此“不合理的”安排,大家都无可奈何,但是对家人的思念和对传统文化的传承,春节…

Leetcode—739.每日温度【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—739.每日温度 单调栈实现思想 从右到左实现代码 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();stack<int> st;vector<i…

【产品设计】SaaS平台产品架构设计

产品架构是基于业务架构的&#xff0c;那么做产品架构前&#xff0c;需要对业务架构有哪些清晰的了解呢&#xff1f; 当我们去搜索“架构”&#xff0c;可以得到很多的架构图片&#xff0c;比如组织架构、业务架构、数据架构、技术架构、安全架构、产品架构、部署架构等。 什么…

Zookeeper 实战 | Zookeeper 和Spring Cloud相结合解决分布式锁、服务注册与发现、配置管理

专栏集锦&#xff0c;大佬们可以收藏以备不时之需&#xff1a; Spring Cloud 专栏&#xff1a;http://t.csdnimg.cn/WDmJ9 Python 专栏&#xff1a;http://t.csdnimg.cn/hMwPR Redis 专栏&#xff1a;http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏&#xff1a;http://t.csdni…

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…

网络和Linux网络_6(应用层)HTTPS协议(加密解密+中间人攻击+证书)

目录 1. HTTPS协议介绍 1.1 加密解密和秘钥的概念 1. 2 为什么要加密 2. 对称加密和非对称加密 2.1 只使用对称加密 2.2 只使用非对称加密 2.3 双方都使用非对称加密 2.4 使用非对称加密对称加密 2.5 中间人攻击MITM 3. 证书的概念和HTTPS的通信方式 3.1 CA认证机构…

java对象 转换成json字符串 工具类 jackson

jackson概述 Jackson 是一个用于处理 JSON 数据的 Java 库&#xff0c;由 FasterXML 公司开发和维护。它提供了一组功能强大的 API&#xff0c;用于在 Java 对象和 JSON 数据之间进行高效的序列化&#xff08;将对象转换为 JSON 格式&#xff09;和反序列化&#xff08;将 JSO…

『VUE3后台—大事件管理系统』

项目地址&#xff1a;https://gitee.com/csheng-gitee/vue3-big-event-admin 技术栈&#xff1a;VUE3 Pinia Pnpm&#xff08;本项目暂不用 typescript&#xff09; 一、前期准备工作 1、创建项目 npm install -g pnpm pnpm create vue2、ESLint 配置 (1) 禁用 prettier 插…

Linux系统下查询指定网卡的型号及用途

接到应用侧的特殊要求&#xff0c;需要查询服务器上特定网口的物理型号及配置用途&#xff0c;发现没有一条现成指令可以完成此事。经测试&#xff0c;可按以下步骤执行3条命令来组合完成。 一、使用lspci命令来查询指定网卡的型号 按照以下步骤进行操作&#xff1a; 打开终…

泗博Modbus转Profinet网关TS-180对水表流量的监控应用

应用场景&#xff1a; 陕西某工程技术有限公司在一民生工程项目中&#xff0c;需要对公园直饮水进行净化保证其水质。直饮水净化装置需根据用水量不定期的维护&#xff0c;通过统计各个净化装置净化的直饮水的流量&#xff0c;来实现提前维护目的。 应用痛点&#xff1a; 项目…

GItHUB push 下来的 Realsense-ros包,使用IntelRealSense

Linux查看内核版本&#xff1a; uname -r Linux 发行版 使用预构建包 英特尔实感™ SDK 2.0 为基于 Intel X86/AMD64 的 Debian 发行版提供 dpkg 格式的 Ubuntu 16/18/20/22 LTS 安装包。 实感 DKMS 内核驱动程序包 &#xff08;&#xff09; 支持 Ubuntu LTS 内核 4.4、4.…