STM32基于HAL库串口printf使用和接收



我们这里使用HAL库直接用cubemx生成代码配置串口

1.打开cubemx,选择MCU型号

2.我这里使用的是STM32F103C8T6,根据自己的型号选择,这里不限制型号

3.选择时钟源

4.系统设置

5时钟配置


5.选择和配置串口




5.配置中断和中断优先级

6.工程设置

7.代码生成设置



cubemx代码生成注意事项

添加代码


/* USER CODE BEGIN Prototypes */#define RX_BUFFER_SIZE 256typedef struct {uint8_t RxBuffer[RX_BUFFER_SIZE];uint8_t RxData;uint16_t RxDataCnt;
}UART_RxTypeDef;extern UART_RxTypeDef Uart1Rx;   // 为UART1声明外部结构体变量/* USER CODE END Prototypes */


 

/* USER CODE BEGIN 0 */UART_RxTypeDef Uart1Rx = {{0}, 0, 0};  // 为UART1初始化结构体// 重定向c库函数printf到huart1
int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart1, &ch, 1, 0xffff);return ch;
}
/* USER CODE END 0 */

/* USER CODE BEGIN Includes */#include <stdio.h>
#include <string.h>#include "usart.h"
/* USER CODE END Includes */

关键的一点,如果不勾选这个选项,那么是无法运行printf代码,整个代码无法运行



然后我们如果不想每次烧录后都要按下复位键




然后我们就测试一下代码是否可以正常运行

主函数while循环
 

  /* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("Hello World!\r\n");HAL_Delay(1000);}/* USER CODE END 3 */

烧录后,打开我们的串口工具
我这里用的是正点原子的xcom串口助手


现在说明我们的串口发送是可以的了

然后我们需要串口接收
之前我们已经配置好了NVIC中断向量了
已经使能了串口中断
在HAL库中,串口如果发送中断会进入中断服务函数,然后在这个函数中他帮我们处理了很多东西,我们只需要调用一个回调函数,这个回调函数是弱定义,我们可以重新定义

在usart.c最下面添加代码:
 

/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){Uart1Rx.RxBuffer[Uart1Rx.RxDataCnt++] = Uart1Rx.RxData;   //接收数据转存if(Uart1Rx.RxDataCnt > RX_BUFFER_SIZE) {memset(Uart1Rx.RxBuffer,0x00,sizeof(Uart1Rx.RxBuffer));Uart1Rx.RxDataCnt = 0;}if((Uart1Rx.RxBuffer[Uart1Rx.RxDataCnt - 2] == '\r' && Uart1Rx.RxBuffer[Uart1Rx.RxDataCnt - 1] == '\n')) //判断结束位{HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1Rx.RxBuffer, Uart1Rx.RxDataCnt,0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束Uart1Rx.RxDataCnt = 0;memset(Uart1Rx.RxBuffer,0x00,sizeof(Uart1Rx.RxBuffer)); //清空数组}HAL_UART_Receive_IT(&huart1, (uint8_t *)&Uart1Rx.RxData, 1);   //再开启接收中断}
}
/* USER CODE END 1 */

这样子还不够,还需要在代码初始化时,先开启接收一次数据

  /* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, (uint8_t *)&Uart1Rx.RxData, 1);/* USER CODE END 2 */

烧录测试


补充
1.为什么使用printf需要在编译软件中勾选Use MicroLIB?
答:MicroLIB是一个针对ARM Cortex-M系列处理器优化的C库,相比标准C库,它更适用于资源有限的嵌入式系统,提供了更高效的空间和速度性能

资源优化:MicroLIB经过优化,更适合嵌入式系统的资源限制。

重定向支持:通过MicroLIB,可以更容易地实现printf等标准输出函数的重定向,方便开发者使用这些函数输出调试信息到串口。

2.什么是重定向?
在编程中,重定向是指改变一个操作(比如输入输出)的默认行为,将其指向另一个方向或者设备。例如,将标准输出(通常是屏幕)重定向到打印机或文件。在STM32等嵌入式设备上,将printf的输出重定向到串口通讯,使得通过串口可以发送调试或其他信息到外部设备,如电脑终端。

printf通常不能直接使用来输出信息,因为标准的printf函数是用于在计算机上向终端或文件输出信息的,而微控制器一般使用串口(UART)作为与外界通信的手段。为了能够在串口上使用printf输出调试或其他信息,需要将printf重定向到串口,这就是“重定向”的含义。
 

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

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

相关文章

node环境安装、vue-cli搭建过程、element-UI搭建使用过程

vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;我们的开发更加的快速 前端项目架…

探索Python测试的奥秘:nose库的魔法之旅

文章目录 探索Python测试的奥秘&#xff1a;nose库的魔法之旅1. 背景&#xff1a;为什么要用nose&#xff1f;2. nose是什么&#xff1f;3. 如何安装nose&#xff1f;4. 五个简单的库函数使用方法4.1 nose.tools.assert_true4.2 nose.tools.assert_equal4.3 nose.tools.raises4…

html2canvas、pdf-lib、file-saver将html页面导出成pdf

html2canvas、pdf-lib、file-saver将html页面导出成pdf 项目背景 需要根据用户的账号信息&#xff0c;生成一个pdf报告发给客户&#xff0c;要求报告包含echart饼图、走势图等。 方案 使用html2canvas&#xff0c;将页面转成图片&#xff0c;再通过pdf-lib将图片转成pdf文件…

Visual Studio Code离线汉化

从官网下载Visual Studio Code安装包后&#xff0c; 下载Visual Studio Code&#xff1a;https://code.visualstudio.com/ 若因网络等问题无法在线安装语言包&#xff0c;可以尝试离线安装&#xff1a; 从官网下载语言包&#xff1a; Extensions for Visual Studio family …

Stable Diffusion majicMIX_realistic模型的介绍及使用

一、简介 majicMIX_realistic模型是一种能够渲染出具有神秘或幻想色彩的真实场景的AI模型。这个模型的特点是在现实场景的基础上&#xff0c;通过加入一些魔法与奇幻元素来营造出极具画面效果和吸引力的图像。传统意义的现实场景虽然真实&#xff0c;但通常情况下缺乏奇幻性&a…

【网络世界】网络层

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 网络层 &#x1f4c1; IPV4 &#x1f4c2; 什么是IP地址 &#x1f4c2; 网段划分 &#x1f4c2; 特殊IP &#x1f4c2; 内网和公网 &#x1f4c2; IPV4的危机 &#x1f4c1; IP协议格式 &#x1f4c1; 路由 &#x1f…

极限的性质【上】《用Manim可视化》

通过前面的极限的定义&#xff0c;现在是计算极限的时候了。然而&#xff0c;在此之前&#xff0c;我们需要一些极限的性质&#xff0c;这将使我们的工作变得简单一些。我们先来看看这些。 极限的性质&#xff1a; 1.常数对极限的影响 1.首先&#xff0c;我们假设和存在&…

通过Origin提取图片数据

第一步&#xff1a; Tool --> Digitizer 第二步&#xff1a;点击文件&#xff0c;导入图片 第三步&#xff1a;设置坐标轴位置和数值&#xff08;Edit Aix&#xff09; 滑动鼠标放大图片&#xff0c;将X1移动到0&#xff0c;X2移动到80&#xff0c;Y1移动到97.0&#xff0c…

Kubernetes 上安装 Jenkins

安装 Helm curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash添加 Jenkins Helm 仓库 首先添加 Jenkins Helm 仓库 helm repo add jenkins https://charts.jenkins.io helm repo update安装 Jenkins 使用 Helm 安装 Jenkins 的最新版本&…

本地部署Xinference实现智能体推理工作流(二)

第二篇章 Dify接入 Xinference 部署的本地模型 1. 安装Dify 克隆 Dify 源代码至本地。 git clone https://github.com/langgenius/dify.git 2. 启动Dify 进入 Dify 源代码的 docker 目录&#xff0c;执行一键启动命令&#xff1a; cd dify/docker cp .env.example .env d…

【OWOD论文】开放世界中OD代码_2_模型部分

简介 本文记录OWOD代码中的模型代码部分。数据部分可看我上一个博客【【OWOD论文】开放世界中OD代码_1_数据部分-CSDN博客】 模型代码 1 起步 在代码中找到 detectron2\engine\defaults.py DefaultTrainer类 __init__方法 根据上述 build_model 回溯到 detectron2\modeling\…

无人机校企合作:组装、维修、研发全面提升学生技能方好就业

无人机校企合作在组装、维修、研发等方面全面提升学生技能&#xff0c;进而促进学生就业&#xff0c;是一个具有前瞻性和实践性的教育模式。以下是对该合作模式的详细分析&#xff1a; 一、合作背景与意义 随着无人机技术的快速发展和广泛应用&#xff0c;市场对无人机专业人…

叉车(工业车辆)安全管理系统,云端监管人车信息运营情况方案

近年来&#xff0c;国家和各地政府相继出台了多项政策法规&#xff0c;从政策层面推行叉车智慧监管&#xff0c;加大叉车安全监管力度。同时鼓励各地结合实际&#xff0c;积极探索智慧叉车建设&#xff0c;实现作业人员资格认证、车辆状态认证、安全操作提醒、行驶轨迹监控等&a…

react学习之useState和useEffect

useState useState 可以使函数组件像类组件一样拥有 state&#xff0c;函数组件通过 useState 可以让组件重新渲染&#xff0c;更新视图。 实际使用 setstate()中回调函数的返回值将会成为新的state值回调函数执行时&#xff0c; React会将最新的state值作为参数传递 const A…

【HarmonyOS 4.0】@BuilderParam 装饰器

1. BuilderParam 装饰器 BuilderParam 装饰器用于装饰自定义组件(struct)中的属性&#xff0c;其装饰的属性可作为一个UI结构的占位符&#xff0c;待创建该组件时&#xff0c;可通过参数为其传入具体的内容。参数必须满足俩个条件&#xff1a; 2.1 参数类型必须是个函数&#x…

windows安全软件之火绒杀毒的密码忘记后处理

一、问题描述 某次&#xff0c;想升级系统补丁&#xff0c;但多次尝试后都失败&#xff0c;排查杀毒软件影响过程中&#xff0c;发现火绒杀毒配置了密码保护&#xff0c;但因时间太久&#xff0c;密码已无从考证&#xff0c;那我们应该怎样处理这种情况呢&#xff1f; 二、处…

鸿蒙XComponent组件的认识

概述&#xff1a; XComponent组件作为一种渲染组件&#xff0c;通常用于满足开发者较为复杂的自定义渲染需求&#xff0c;例如相机预览流的显示、游戏画面的渲染、自定义视频播放器等等。其中Native API是其核心内容&#xff01; 其可通过指定其type字段来实现不同的功能&…

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins&#xff0c;系统管理→ 插件管理 → 搜索 kubernetes&#xff0c;选择第二个 Kubernetes&#xff0c;点击 安装&#xff0c;安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外&#xff0c;所以…

解决huggingface下载时Username/Password Authentication Failed.问题

项目场景&#xff1a; 使用huggingface 下载数据集。 问题描述 运行命令&#xff1a; wget https://huggingface.co/datasets/yangtaointernship/RealEstate10K-subset/resolve/main/google_scanned_objects.zip?downloadtrue 完整报错如下&#xff1a; --2024-08-30 15:…

Windows通过网线连接开发板共享网络

Windows端 打开更开适配器选项右键WLAN–属性–共享 右键以太网–属性–Internet协议版本4(TCP/IPv4) 记住IP地址 开发板端 查看网卡 ifconfig设置IP在同一网段 ifconfig eth0 192.168.137.2 netmask 255.255.255.0设置网关 route add default gw 192.168.137.1配置DNS su…