STM32-hal库学习(4)--usart/uart通信 (同时显示在oled)

前言:

关于usart详解:

stm32-USART通信-CSDN博客

因为在oled上显示,我们直接在上一个工程进行修改:

STM32_hal库学习(3)-OLED显示-CSDN博客

其他配置与oled显示工程保持不变,打开oled文件的工程:

配置:

开启USART1:

点击USATR1  ——>设置MODE为异步通信(Asynchronous)  ——>     波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 ,接收和发送都使能 。

然后,NVIC Settings 一栏使能接收中断

时钟树与上个工程保持一致。

选择工程配置:

选上每个功能独立生成.c.h

常用函数:

1、串口发送/接收函数

HAL_UART_Transmit();串口发送数据,使用超时管理机制 
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送  
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送

HAL_UART_Receive_DMA();串口DMA模式接收

串口发送:

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。

参数:

第一个: UART_HandleTypeDef *huart    UATR的别  如 :   UART_HandleTypeDef huart1;   别名就是huart1  
第二个:*pData      需要发送的数据 
第三个:Size    发送的字节数
第四个:Timeout   最大发送时间,发送数据超过该时间退出发送   

例:

  HAL_UART_Transmit(&huart1, (uint8_t *)ymj, 3, 0xffff);   //串口发送三个字节数据,最大传输时间0xffff

中断接收数据:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

功能:串口中断接收,以中断方式接收指定长度数

        大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

2、串口中断函数

HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数
HAL_UART_ErrorCallback();串口接收错误函数

HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  

功能:对接收到的数据进行判断和处理  判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用

3、串口查询函数

HAL_UART_GetState();  判断UART的接收是否结束,或者发送数据是否忙碌

while(HAL_UART_GetState(&huart4) == HAL_UART_STATE_BUSY_TX)   //检测UART发送结束

常用的有:

1.阻塞模式收发数据

        HAL_UART_Transmit():串口发送数据,使用超时管理机制
        HAL_UART_Receive(): 串口接收数据,使用超时管理机制

2.中断模式收发数据
        HAL_UART_Transmit_IT():串口中断模式发送
        HAL_UART_Receive_IT(): 串口中断模式接收

3.DMA模式收发数据
        HAL_UART_Transmit_DMA():串口DMA模式发送
        HAL_UART_Transmit_DMA():串口DMA模式接收

程序实现:

程序参考:

STM32CubeMx+HAL库:USART串口收发数据的三种方式_单片机串口接收方式-CSDN博客

注意,要勾选Use MicroLib(点击魔法棒-Target),如果不点,可能会收不到信息。

1.在usart.c重写(记得包含头文件#include "stdio.h")

int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;
}/*** 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx* 输入参数: 无* 返 回 值: 无* 说    明:无*/
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;
}

2.main.c加上()

#include "stdio.h"
#define RXBUFFERSIZE  256     //最大接收字节数
char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数 
int value=0;

3.int main加入

HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

4.while加入

value++;
printf("%d\r\n",value);
OLED_ShowNum(24,4,value,4,24, 0);
HAL_Delay(1000);

5.末尾加上回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning *///UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*/if(Uart1_Rx_Cnt >= 255)  //溢出判断{Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer));HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); 	}else{RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位{HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束Uart1_Rx_Cnt = 0;memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}

最终测试实现:

每秒+1,同时在oled显示

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

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

相关文章

装箱问题汇总

一维装箱 整数规划建模 参考 二维装箱 数学建模 参考1 参考2

并发编程工具集——Lock和Condition(上)(十二)

简述:Java SDK 并发包通过 Lock 和 Condition 两个接口来实现管程,其中 Lock 用于解决互斥问题,Condition 用于解决同步问题。 再造管程的理由和期望 理由:synchronized 没有办法解决“破坏不可抢占条件方案”。 原因是synchroniz…

查看Oracle、MySQL、PostGreSQL中的依赖关系

查看Oracle、MySQL、PostGreSQL中的依赖关系 在有些程序员开发习惯中,喜欢为了应用代码的简洁或复用,而在数据库创建一个复杂关连查询的VIEW,甚至是VIEW套VIEW嵌套使用, 这里就有个问题如果上线后如发现依赖的表字段类型或长度不…

Linux kernel 与 设备树

Linux kernel 与 设备树 1 介绍1.1 概述1.2 发展历程1.3 各版本发布时间及特色1.4 Linux 单内核1.5 Linux 内核网址1.6 NXP 官方镜像与 野火 鲁班猫镜像的区别 2 Linux 内核组成2.1 进程管理2.2 内存管理2.3 文件系统2.4 设备管理2.5 网络功能 3 Linux 内核编译3.1 编译 Kernel…

小程序发布必须进行软件测试吗?测试内容有哪些?

在如今移动互联网时代,小程序已成为许多企业广泛采用的一种营销手段,然而,发布小程序之前进行充分的软件测试是至关重要的,因为它不仅可以确保小程序的质量,还可以避免潜在的风险和损失。 在进行小程序发布前进行软件…

可逆质子陶瓷电化学电池(R-PCEC)作为新型能量存储与转换装置开发应用价值大

可逆质子陶瓷电化学电池(R-PCEC)作为新型能量存储与转换装置开发应用价值大 可逆质子陶瓷电化学电池(R-PCEC),同时具有燃料电池与电解槽功能,能够实现电能、化学能相互转化,是最具有发展前景的能…

mongodb(笔记向,有点乱哈)

基于分布式文件存储的数据库,c语言,介于关系与非关系数据库之间的产品。非关系数据库中功能最丰富,最像关系数据库的,存储比较复杂的数据类型。 语法有点类似于面向对象的查询语言,几乎可以实现类似数据库单表查询的绝…

「51媒体」政企活动媒体宣发如何做?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 政企活动媒体宣发是一个系统性的过程,需要明确…

vue3如何实现一进入vue页面就全屏?

import { onUnmounted } from vue;onMounted(() > {fullscreenElement.value?.requestFullscreen() .then(() > { console.log(全屏成功); }) .catch(err > { console.error(全屏失败:, err); }); });

餐饮冷库安全守护神:可燃气体报警器检定的科学性与有效性

随着餐饮业的快速发展,冷库成为储存食材、保证食品质量的重要场所。 然而,由于冷库环境的特殊性,如密封性强、温度低、湿度大等,一旦冷库内发生可燃气体泄露,后果将不堪设想。因此,在餐饮冷库中安装并合理…

SpringBoot集成道历(实现道历日期查询)

官网地址&#xff1a;官网地址https://6tail.cn/calendar/api.html 1、导入依赖 <dependency><groupId>cn.6tail</groupId><artifactId>lunar</artifactId><version>1.3.9</version></dependency><dependency><group…

大模型微调(finetune)方法

lora adapter prefix-tuning p-tuning prompt-tuning 大模型微调后灾难行遗忘 1、主流解决大模型微调后灾难行遗忘的方法是在微调过程中加入通用的指令数据。 2、自我蒸馏方法主要是通过模型本身对任务数据进行生成引导&#xff0c;构建自我蒸馏数据集&#xff0c;改变任务数…

MQTT遗嘱信息(2)

接前一篇文章&#xff1a;MQTT遗嘱信息&#xff08;1&#xff09; 本文内容参考&#xff1a; 什么是MQTT遗嘱消息&#xff1f;如何配置和处理遗嘱消息&#xff1f;_mqtt last will-CSDN博客 MQTT 协议学习&#xff1a;Retained&#xff08;保留消息&#xff09; 与 LWT&#x…

shark云原生-日志管理体系-filebeat

文章目录 1. deploy 文件1.1 RBAC1.2. DaemonSet1.2.1. Elasticsearch 连接信息1.2.2. Volume 1.3. ConfigMap1.3.1. 日志收集路径1.3.2. 日志事件输出目标 2. 在控制平面节点上运行Filebeat3. 查看输出3.1. 关于处理器 processors 4. 日志收集配置4.1. 手动指定日志收集路径4.…

前端生成循环数组的值

生成循环数组的值可以通过以下方式实现&#xff1a; // 定义一个函数&#xff0c;输入是数组和循环的次数 function generateCircularArray(arr, n) {// 循环n次for (let i 0; i < n; i) {// 每次都从数组尾部取一个元素&#xff0c;移除它&#xff0c;然后添加到数组头部…

基于SpringBoot前后端分离旅游出行管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

Qt 无预处理步骤的可用性探讨

在多平台GUI开发中&#xff0c;Qt库广受推崇。然而&#xff0c;对于某些开发者而言&#xff0c;Qt的预处理工具 moc&#xff08;Meta-Object Compiler&#xff09;可能成为进入Qt世界的一道门槛。本文将探讨Qt在不使用预处理工具的情况下的可用性&#xff0c;并分享社区中的一些…

聚观早报 | iPhone 16核心硬件曝光;三星Galaxy全球新品发布会

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月28日消息 iPhone 16核心硬件曝光 三星Galaxy全球新品发布会 苹果正多方下注布局AI商店 黄仁勋2024年薪酬3400…

力扣第213题“打家劫舍 II”

在本篇文章中&#xff0c;我们将详细解读力扣第213题“打家劫舍 II”。通过学习本篇文章&#xff0c;读者将掌握如何使用动态规划来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第213题…

Zynq7000系列FPGA中的DMA控制器简介(一)

DMA控制器&#xff08;DMAC&#xff09;使用64位AXI主接口来执行与系统存储器和PL外围设备之间的DMA数据传输&#xff0c;操作频率同CPU_2x的时钟速率。传输由DMA指令执行引擎控制。DMA引擎运行在一个小指令集上&#xff0c;该指令集提供了一种灵活的指定DMA传输的方法。这种方…