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

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

首先 要使用printf和scanf 必不可少的就是

#include <stdio.h>

这里需要做的就是配置单片机的UART 并且使其能够被printf和scanf调用

在这里插入图片描述
打开异步工作模式 并且选择同时收发 配置好波特率 停止位 校验位即可

最简单的重定向函数如下:

#pragma import(__use_no_semihosting_swi)
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
FILE __stdin;//串口打印配置函数 printf
int fputc(int ch, FILE *f)  
{HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xFFFF);return ch;
}
//串口接收函数 scanf
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart2,&ch,1,0xFFFF);return ch;
}

这里用的收发函数均为阻塞收发模式

为了进行随时的接收 则需要引入接收中断监控(非阻塞)
在NVIC里开启中断
在这里插入图片描述
同时覆写接收中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart==&huart2){		HAL_UART_Transmit(&huart2,&RxBuffer,1,0xFFFF);HAL_UART_Receive_IT(&huart2,&RxBuffer,1);}
}

而在使用前 需要先开启接收中断

故可以在UART初始化后加上一句:

/* USER CODE BEGIN USART2_Init 2 */HAL_UART_Receive_IT(&huart2,&RxBuffer,1);/* USER CODE END USART2_Init 2 */

这里的RxBuffer为全局变量 别忘了定义 一般定义uint8_t即可

uint8_t RxBuffer=0;

同样 在回调函数中 实现的基本功能就是将发送的数据返回来
在这里插入图片描述
如果这样配置的话 则会导致初始化后 由于开启了中断接收 故不会执行scanf中的阻塞发送语句 执行时会直接返回BUSY标志

所以只需要修改scanf即可

//串口接收函数 scanf
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_AbortReceive_IT(&huart2);HAL_UART_Receive(&huart2,&ch,1,0xFFFF);HAL_UART_Receive_IT(&huart2,&RxBuffer,1);return ch;
}

先关闭接收中断 然后等待接收 最后再开启中断 最后一项时间是等待时间

在使用scanf时 即会进行阻塞接收 若一直接收不到 则一直等待

这里只能接收一个数据长度 若想接收多个 则需要重新配置 比如:

//串口接收函数 scanf
int fgetc(FILE *f)
{int ch = 0;HAL_UART_AbortReceive_IT(&huart2);HAL_UART_Receive(&huart2,(uint8_t *)&ch,4,0xFFFF);HAL_UART_Receive_IT(&huart2,&RxBuffer,1);return ch;
}

但int类型最大也就4个字节长度了

也可以用数组的方式进行接收 但调用的时候只能用全局变量数组

还有就是 别忘了勾选MicroLIB库
在这里插入图片描述
或者在重定向前添加以下代码 以屏蔽报错

void _sys_exit(int x) 
{ x = x; 
} 
void _ttywrch(int ch)
{ch = ch;
}

相关文章:

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

【STM32笔记】HAL库UART串口配置及重定向&#xff08;解决接收中断与scanf不能同时工作的问题&#xff09; 首先 要使用printf和scanf 必不可少的就是 #include <stdio.h>这里需要做的就是配置单片机的UART 并且使其能够被printf和scanf调用 打开异步工作模式 并且选择…...

【前端CSS面试题】2023前端最新版css模块,高频15问

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;博主收集的CSS面试题 目录 一、CSS必备面试题 1.CSS3新特性 2.CSS实现元素两个盒子垂…...

Linux命令大全,赶紧收藏!

新的一年 新的征程 新的课程开班 等你来学&#xff01; 本文为Linux命令大全&#xff0c;从A到Z都有总结&#xff0c;建议大家收藏以便查用&#xff0c;或者查漏补缺&#xff01; A 命令 描述 access 用于检查调用程序是否可以访问指定的文件&#xff0c;用于检查文件…...

大数据入门怎么学习

大数据学习不能停留在理论的层面上&#xff0c;大数据方向切入应是全方位的&#xff0c;基础语言的学习只是很小的一个方面&#xff0c;编程落实到最后到编程思想。学习前一定要对大数据有一个整体的认识。 大数据是数据量多吗&#xff1f;其实并不是&#xff0c;通过Hadoop其…...

用于异常检测的深度神经网络模型融合

用于异常检测的深度神经网络模型融合 在当今的数字时代&#xff0c;网络安全至关重要&#xff0c;因为全球数十亿台计算机通过网络连接。近年来&#xff0c;网络攻击的数量大幅增加。因此&#xff0c;网络威胁检测旨在通过观察一段时间内的流量数据来检测这些攻击&#xff0c;…...

游戏服务器如何选择合适的服务器配置

游戏服务器如何选择合适的服务器配置 大家好&#xff0c;今天给大家分享一下游戏服务器配置的选择&#xff0c;为什么特别的说明一下服务器呢&#xff1f;服务器是决定服稳定性和安全性最重要的一个程序&#xff0c;如果是服务器配置不够&#xff0c;可能会导致服掉线、卡顿的…...

01-幂等性解释,问题及常用解决方案

目录 1. 幂等性简介 2. 后端如何解决幂等性问题 2.1 数据库层面 -> 2.1.1 防重表 -> 2.1.2 数据库悲观锁(不建议,容易出现死锁情况) -> 2.1.3 数据库乐观锁 -> 2.1.4 乐观锁CAS算法原理 2.2 锁层面 2.3 幂等性token层面 -> 2.3.1 简介文字描述: …...

SpringBoot配置文件

配置文件有两种格式&#xff1a; .properties .yml .properties是老版配置文件&#xff0c;.yml是新版配置文件 一、properties详解 IDEA社区版不支持 properties格式的日志的提示&#xff0c;需要安装相应插件。 3.1properties 基本语法 &#xff08;ps:小技巧&#xff0…...

基于蜣螂算法改进的DELM分类-附代码

蜣螂算法改进的深度极限学习机DELM的分类 文章目录蜣螂算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.蜣螂算法4.蜣螂算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1a;https://blog.c…...

FPGA纯verilog代码实现图像对数变换,提供工程源码和技术支持

目录1、图像对数变换理论2、log系数的matlab生成3、FPGA实现图像对数变换4、vivado与matlab联合仿真5、vivado工程介绍6、上板调试验证并演示7、福利&#xff1a;工程代码的获取1、图像对数变换理论 对数变换可以将图像的低灰度值部分扩展&#xff0c;显示出低灰度部分更多的细…...

【Python百日进阶-Web开发-Vue3】Day516 - Vue+ts后台项目3:首页

文章目录 一、首页头部1.1 element-plus中找到适合的Container布局容器1.2 头部容器Layout 布局1.3 src/views/HomeView.vue二、侧边菜单栏2.1 element-plus中找到适合的Menu侧栏2.2 src/views/HomeView.vue三、侧边栏的动态路由3.1 src/views/HomeView.vue3.2 src/views/Goods…...

分析了 200 个 DeFi 项目,我发现了这些规律

作者&#xff1a;Ren & Heinrich翻译&#xff1a;dongdong在这篇文章中&#xff0c;我分享了我通过分析当前排名前 200 的 DeFi 加密项目的见解。这不是一项学术研究。尽管如此&#xff0c;这些发现对加密货币投资者来说具有附加值。我使用 https://defillama.com/ 的公共数…...

你领证了吗?各地2022下半年软考纸质证书发放中

不少同学都在关注2022下半年软考证书领取时间&#xff0c;截止至目前&#xff0c;江苏、南京、山东、浙江、贵州、云南、大连、广西地区的纸质证书可以领取了&#xff0c;请大家在证书申领时间内及时预约证书邮寄发放哦~ 江苏 证书领取时间&#xff1a;2023年2月3日起 南京 …...

将群晖NAS变为本地盘

本文介绍一个工具&#xff0c;可以在 Windows 系统下将群晖NAS的目录变为本地盘&#xff0c;好处是在外部访问的时候&#xff0c;能够大大改善体验。可以用本地的应用程序直接打开&#xff0c;速度依赖网络带宽&#xff0c;正常情况下&#xff0c;看视频是没有问题的。当然&…...

以太坊上交易异常Pending的处理方法

交易Pending ETH交易pending的原因: 1.交易GasPrice设置过低,共识节点不打包 2.账户Nonce不连续,一直处于交易池队列当中 只要确认了是哪种原因引起的,就可以做出对应的解决方案。 GasPrice设置过低 由于ETH共识节点是按照Gas价格从高到低打包交易,如果每笔交易的GasPr…...

第三节 第一个内核模块

hellomodule 实验 实验说明 硬件介绍 本节实验使用到STM32MP157 开发板 实验代码讲解 本章的示例代码目录为&#xff1a;linux_driver/module/hellomodule 从前面我们已经知道了内核模块的工作原理&#xff0c;这一小节就开始写代码了&#xff0c;跟hello world 一样&…...

从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及&#xff0c;对地观测已具备多次以上的全球覆盖…...

操作系统的奋斗(三)内存管理

第三章 内存管理3.1内存管理概念3.1.1 内存管理的基本原理和要求&#xff08;1&#xff09;内存管理的主要功能3.1.2 覆盖和交换&#xff08;1&#xff09;覆盖&#xff08;2&#xff09;交换3.1.3 连续分配管理方式&#xff08;1&#xff09;单一连续分配&#xff08;2&#x…...

多选多的一种通用处理逻辑

开发的时候&#xff0c;我们经常会涉及元素的多选多&#xff0c;并且还需要对选中的元素进行拖动排序 通用的设计方案如下 游戏资源集合与游戏资源的绑定关系处理&#xff08;多选多的一种通用处理逻辑&#xff09; 可能的情况&#xff1a; 1.之前被选中的资源&#xff0c;现…...

Redis 的安装 + SpringBoot 集成 Redis

1.安装 Redis此处的 Redis 安装是针对 Linux 版本的安装, 因为 Redis 官方没有提供 Windows 版本, 只提供了 Linux 版本. 但是我们可以通过Windows 去远程连接 Redis.1.1 使用 yum 安装 Redis使用如下命令, 将 Redis 安装到 Linux 服务器:yum -y install redis1.2 启动 Redis使…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...