hal库实现串口通信——阻塞式 API

1STM32CobeMX设置

设置时钟源

rcc设置为外部时钟High Speed Clock (HSE)//设置为如图

再将其设置为72MHz

设置串口引脚为异步通信

设置波特率等

设置波特率范围提示点击波特率再点击图中的

我的设置

再打开中断

即可生成代码//省略项目设置

2代码设置

函数

HAL_UART_Transmit() - 发送数据到串口。
HAL_UART_Receive() - 从串口接收数据。

解释

HAL_UART_Transmit() - 发送数据到串口。

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  • huart: 指向 UART_HandleTypeDef 结构的指针,该结构包含了 UART 的配置信息。
  • pData: 指向要发送的数据缓冲区的指针。
  • Size: 要发送的数据的字节数。
  • Timeout: 发送操作的超时时间(以毫秒为单位)。如果设置为 HAL_MAX_DELAY,则表示无限期等待。
  • 返回值: 函数执行状态(HAL_OK 表示成功,HAL_ERROR 表示错误,HAL_BUSY 表示忙,HAL_TIMEOUT 表示超时)。

HAL_UART_Receive() - 从串口接收数据。

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  • huart: 指向 UART_HandleTypeDef 结构的指针,该结构包含了 UART 的配置信息。
  • pData: 指向用于接收数据的缓冲区的指针。
  • Size: 要接收的数据的字节数。
  • Timeout: 接收操作的超时时间(以毫秒为单位)。如果设置为 HAL_MAX_DELAY,则表示无限期等待。
  • 返回值: 函数执行状态(HAL_OK 表示成功,HAL_ERROR 表示错误,HAL_BUSY 表示忙,HAL_TIMEOUT 表示超时)。

这些函数在发送或接收数据时会阻塞,直到操作完成或发生超时。因此,在调用这些函数时,应该确保 UART 已经正确初始化,并且 pData 和 Size 参数指定了正确的数据缓冲区和大小。超时参数 Timeout 可以用来避免在通信问题导致数据无法发送或接收时无限期地等待。

当您使用 HAL_UART_Transmit() 和 HAL_UART_Receive() 函数时,您不需要手动检测是否有数据写入或读取,因为这些函数会自动处理数据的发送和接收。

实例解释

发送数据实例

#include "stm32f1xx_hal.h"UART_HandleTypeDef huart; // 假设这是您的UART句柄int main(void)
{HAL_Init(); // 初始化HAL库SystemClock_Config(); // 配置系统时钟MX_USART2_UART_Init(); // 初始化UARTuint8_t txData[] = "Hello, World!"; // 要发送的数据uint16_t size = sizeof(txData) - 1; // 发送数据的大小(减1是为了排除字符串末尾的'\0')// 发送数据if (HAL_UART_Transmit(&huart, txData, size, HAL_MAX_DELAY) != HAL_OK){// 发送失败的处理Error_Handler();}// ... 其他代码 ...while (1){// 主循环}
}

接收数据实例

#include "stm32f1xx_hal.h"UART_HandleTypeDef huart; // 假设这是您的UART句柄int main(void)
{HAL_Init(); // 初始化HAL库SystemClock_Config(); // 配置系统时钟MX_USART2_UART_Init(); // 初始化UARTuint8_t rxData[32]; // 接收数据的缓冲区uint16_t size = sizeof(rxData); // 接收缓冲区的大小// 接收数据if (HAL_UART_Receive(&huart, rxData, size, 5000) != HAL_OK){// 接收失败的处理Error_Handler();}// 处理接收到的数据// ...while (1){// 主循环}
}

用proteus8 实现串口

使用虚拟串口连接

stm32设置

里面的时钟值为stm32最终输出的值下图的值

串口图

串口设置

总结

HAL_UART_Transmit() - 发送数据到串口。
HAL_UART_Receive() - 从串口接收数据。

此函数会一直消耗系统内核资源,处于一直检测状态

使用sizeof();计算数组个数

调用的数组为指针类型//改变类型时记得转换

Proteus  8的stm32的时钟源为最终分频倍频之后的频率

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

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

相关文章

docker使用canal

1. 准备MySql主库 1.1.在服务器新建文件夹 mysql/data,新建文件 mysql/conf.d/my.cnf 其中my.cnf 内容如下 [mysqld] log_timestampsSYSTEM default-time-zone8:00 server-id1 log-binmysql-bin binlog-do-db mall # 要监听的库 binlog_formatROW配置解读&#…

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据,说明网关已生效,其原理流程图如下: 二、网关过滤器 作用:处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类: a. 某个路由的过滤器 …

CSS实现三栏自适应布局(两边固定,中间自适应)

绝对定位的元素会脱离文档流,它们是相对于包含块(通常是最近的具有相对定位、绝对定位或固定定位属性的父元素)进行定位的。当你把一个绝对定位的元素的高度设置为100%时,它会相对于其包含块的高度来确定自己的高度。如果包含块是…

技术解析:应对国内大流量攻击的新挑战与分布式清洗防御策略

近日,国内网络环境中出现的大流量攻击事件频发,且攻击规模呈指数级增长,部分攻击流量甚至超过了1.5Tbps。 这背后的主要原因是攻击者利用海外流量资源,通过复杂的网络技术和协议转换,将国际IPv4/IPv6流量巧妙伪装并转…

python篇---图片转成视频

python篇—图片转成视频 import cv2 import os# 设置图片文件夹路径和视频输出路径 image_folder /workspace/11 video_name output_video.mp4# 获取图片文件夹中的所有图片文件名,并按顺序排序 images [img for img in os.listdir(image_folder) if img.endswi…

C++的引用和内联函数,auto

什么是引用 引用就是取别名 可以给一个变量取多个别名,也可以给别名取别名 别名与本名拥有同一地址,对任意别名修改,也会同时修改其他别名和本名 引用的作用 引用的作用与指针重叠度很高 图中函数的参数int& a,int& b,a是x的别名,b是y的别名 则ab的交换就是xy的交…

怎么快速围绕“人、货、场”做零售数据分析?

做零售数据分析多了,不难发现零售数据分析的关键就是“人、货、场”,那么怎么又快又灵活地分析这三个关键点?不妨参考下奥威BI零售数据分析方案。 奥威BI零售数据分析方案是一套吸取大量项目经验,结合零售企业数据分析共性需求打…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么?三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

同旺科技 USB TO SPI / I2C 专业版 极限测试 ---- 读取数据

所需设备: 1、USB 转 SPI I2C 适配器;内附链接 备注:带EXCEL调试的只适用于专业版; 软件配置: 设置如下,读取65500个字节,单条指令,速率20Mhz; 数据: 时钟信号&#…

了解 Python 中 gc.collect() 命令

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 在 Python 中,gc.collect() 命令是用于手动触发垃圾回收机制,以回收无法访问的对象所占用的内存。Python 的垃圾回收机制主要基于引用计数,辅以 “标记-清除” 和 “…

echarts坐标轴、轴线、刻度、刻度标签

坐标轴 x、y轴 x 轴和 y 轴都由轴线、刻度、刻度标签、轴标题四个部分组成。部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有x轴和y轴,通常情况下,x轴显示在图表底部,y轴显示在左侧,一般配置如下&#xf…

【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

目录 树和森林树的存储结构一、树的双亲表示法:二、树的孩子表示法方法一:定长结点的多重链表方法二:不定长结点的多重链表方法三:孩子单链表表示法 三、树的二叉链表(孩子-兄弟)存储表示法 森林与二叉树的转换树和森林的遍历先根…

uni-app实现分页--(1)准备工作,首页下拉触底加载更多

实现流程如下: 分析:需要在滚动容器中添加滚动触底,在猜你喜欢中获取数据。难点:如何在父页面调用子组件内的方法。父组件中用ref,并定义组件实例类型,子组件中暴露方法 具体代码如下: 1.在父组件中添加…

计算机视觉——基于深度学习UNet实现的复杂背景文档二值化算法实现与模型训练

1. 引言 阈值分割可以被视为一个分类问题,通常涉及两个类别,这也是为什么阈值分割也被称为二值化。对于文档图像,我们期望阈值算法能够正确地将墨水分类为黑色,将纸张分类为白色,从而得到二值化图像。对于数字灰度图像…

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台,具有多个下行通信接口及一个或者多个上行网络接口,用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后,实时上传主站系统,完成遥信、遥测等能源数据…

【实战解析】YOLOv9全流程训练至优化终极指南

【实战解析】YOLOv9全流程训练至优化终极指南 0.引言1.环境准备2.数据预处理(1)数据准备(2)按比例划分数据集(3)xml转txt脚本(4)配置文件 3.模型训练(1)单GPU…

打开游戏缺少dll文件怎么办,dll文件一键修复方法

在我们日常操作电脑,经常会遇到各种各样的问题。比如想玩一会游戏的时候,电脑屏幕上却赫然弹出一则令人颇为扫兴的提示:“打开游戏缺少dll文件”。这个问题可能会让我们感到困惑和沮丧,但是幸运的是,有很多方法可以帮助…

电压继电器SRMUVS-220VAC-2H2D 导轨安装 JOSEF约瑟

系列型号: SRMUVS-58VAC-2H欠电压监视继电器;SRMUVS-100VAC-2H欠电压监视继电器; SRMUVS-110VAC-2H欠电压监视继电器;SRMUVS-220VAC-2H欠电压监视继电器; SRMUVS-58VAC-2H2D欠电压监视继电器;SRMUVS-100…

数据仓库与数据挖掘(第三版)陈文伟思维导图1-5章作业

第一章 概述 8.基于数据仓库的决策支持系统与传统决策支持系统有哪些区别? 决策支持系统经历了4个阶段。 1.基本决策支持系统 是在运筹学单模型辅助决策的基础上发展起来的,以模型库系统为核心,以多模型和数据库的组合形成方案辅助决策。 它…

如何监控容器或K8s中的OpenSearch

概述 当前 OpenSearch 使用的越来越多, 但是 OpenSearch 生态还不尽完善. 针对如下情况: 监控容器化或运行在 K8s 中的 OpenSearch 我查了下, 官方还没有提供完备的方案. 这里如何监控 K8s 中的 OpenSearch, 包括安装 exporter 插件、采集、展示全环节。 OpenSearch 简介…