当前位置: 首页 > 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;
}
http://www.lryc.cn/news/1072.html

相关文章:

  • 【前端CSS面试题】2023前端最新版css模块,高频15问
  • Linux命令大全,赶紧收藏!
  • 大数据入门怎么学习
  • 用于异常检测的深度神经网络模型融合
  • 游戏服务器如何选择合适的服务器配置
  • 01-幂等性解释,问题及常用解决方案
  • SpringBoot配置文件
  • 基于蜣螂算法改进的DELM分类-附代码
  • FPGA纯verilog代码实现图像对数变换,提供工程源码和技术支持
  • 【Python百日进阶-Web开发-Vue3】Day516 - Vue+ts后台项目3:首页
  • 分析了 200 个 DeFi 项目,我发现了这些规律
  • 你领证了吗?各地2022下半年软考纸质证书发放中
  • 将群晖NAS变为本地盘
  • 以太坊上交易异常Pending的处理方法
  • 第三节 第一个内核模块
  • 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
  • 操作系统的奋斗(三)内存管理
  • 多选多的一种通用处理逻辑
  • Redis 的安装 + SpringBoot 集成 Redis
  • 为什么在容器中 1 号进程挂不上 arthas?
  • 23种设计模式之策略模式
  • 不会做UI自动化测试?一起设计框架再实践吧
  • 数据分析实战项目3:RFM用户分群
  • 消息中间件概述
  • vue和js给后端接口返回的数据(如以json数据为元素的数组)添加新的json字段
  • 负载均衡的方式
  • python(15)--函数设计
  • 手把手教你用Python做可视化数据,还能调节动画丝滑度
  • 湖南中创教育PMP项目管理——变更管理
  • IC真题 —— 刷题记录(1)