【STM32】HAL库三步实现串口重定向(代码复制可用)

这篇具有很好参考价值的文章主要介绍了【STM32】HAL库三步实现串口重定向(代码复制可用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

第一步:添加标准输入输出头文件

第二步:重写fputc()函数

第三步:重写fgetc()函数

代码汇总(直接复制使用)-需要直接来复制


在PC上进行C语言程序开发时,我们可以利用C语言的格式化输出函数 printf()将程序的运行结果发送到显示屏上显示,也可以利用格式化输人函数 scanf()读取由键盘输入的信息。在嵌入式系统的开发中,我们也希望能够将程序的运行结果或者调试信息发送到 PC 上显示,并读取由键盘输入的信息,实现良好的人机交互。

HAL库提供的串口收发函数,功能比较简单,不能进行格式化的输入输出。如果要实现类似 C语言中的格式化输入输出函数,需要把printf()函数的输出和 scanf( )函数的输入重新定向到串口。

具体的实现方法如下:用户编写与C 语言标准库函数中同名的函数,当链接器检查到用户编写了与标准库函数同名的函数时,将优先使用用户编写的函数,从而实现对标准库函数的间接修改(标准库函数中的同名函数采用了 weak 属性定义)。

由于printf()函数通过调用fputc()函数来实现数据的输出,scanf()函数通过调用fgetc()函数来实现数据的输入,因此用户需要改写这两个函数来实现串口的重定向。

在进行重定向之前,需要配置好串口,使用到串口的轮寻模式。

注意:由于 printf()函数和scan()函数是由MDK 软件所提供的 C语言标准库函数,在完成程序编写后,用户还需要在MDK 软件的工程设置窗口中选择“Target”标签页勾选其中的“Use MicroLIB”选项。如果不勾选“Use MicroLIB”选项,则无法使用。

【STM32】HAL库三步实现串口重定向(代码复制可用)

第一步:由于主程序中调用了printf()函数和scanf()函数,因此需要添加标准输入输出头文件:stdio.h。

/* USER CODE BEGIN Includes*/

#include <stdio.h>// 包含标准输入输出头文件

/* USER CODE END Includes*/

第二步:重写fputc()函数

int fputc(int ch,FILE *f)

{

//采用轮询方式发送1字节数据,超时时间设置为无限等待

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);

return ch;

}

注意:由于入口参数ch是整型变量,而函数HAL_UART_Transmit()的入口参数pdata是指向无符号字符型的指针,因此需要进行强制类型转换,将int转换为uint8_t*。

HAL_MAX_DELAY意味着无限等待,可以修改,比如修改为1000。

第三步:重写fgetc()函数

int fgetc(FILE *f)

{

uint8_t ch;

// 采用轮询方式接收 1字节数据,超时时间设置为无限等待

HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );

return ch;

}

注意:调用scanf()函数读取串口数据时,需要以空格作为输入的结束。因此在串口调试助手中输入数据时,必须以空格作为结束,然后再点击发送按钮,否则无法正确接收数据。

scanf()函数只能接收不带空格的字符串。如果用户需要接收一个带空格的字符串,需要先逐个字节的接收,在接收过程中通过不断判断是否接收到 ‘\r’和‘\n’两个字符,来确定字符串是否接收完成。此时,串口调试助手的发送区中应该在输入一个完整字符串后,再按下键盘的“ENTER”键作为结束文章来源地址https://www.toymoban.com/news/detail-447248.html

代码汇总(直接复制使用):

#include <stdio.h>// 包含标准输入输出头文件

int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}

到了这里,关于【STM32】HAL库三步实现串口重定向(代码复制可用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作、重定向卡死、低功耗一直唤醒的问题)

    【STM32】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作、重定向卡死、低功耗一直唤醒的问题) 注意:这里用的编译器版本为ARMCC(也就是第5代编译器 而不是AC6) 首先 要使用printf和scanf 必不可少的就是 这里需要做的就是配置单片机的UART 并且使其能够被pri

    2023年04月08日
    浏览(48)
  • STM32开发中printf利用重定向方法输出到串口(CubeMX 基于HAL库方法,带实际项目应用技巧 巧用goto语句)

    在stdio.h中的printf 原本输出到控制台, 在单片机应用中一般将其改到串口, 并利用串口输出信息来调试程序,非常方便。(本文以USART1为例) 此外CubeMX及CubeIDE 由于自动生成基础代码,因此每当更改硬件配置的时候, 都会被重置生成的基础代码。 这里使用goto语句来避免部分

    2024年02月04日
    浏览(84)
  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(56)
  • 【STM32 HAL库实战】串口DMA + 空闲中断 实现不定长数据接收

    STM32CubeMX最新版: 打开STM32CubeMX软件,点击ACCESS TO MCU SELECTOR,在Commercial Part Number 中输入MCU型号,例如我在这里输入了STM32L431RCT6。选中正确型号然后双击进入下一步的配置界面。 1.1 SYS配置如图 1.2 RCC配置如图 开启了外部晶振,若无则都选择Disable 1.3 USART1配置 NVIC Settings 注意

    2024年02月03日
    浏览(79)
  • STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

    目录 模块选择 编程环境  MLX90614基本原理 通信协议(SMBus通信,类IIC通信) 代码实现 STM32与模块之间接线表 1.标准库实现温度采集 2.HAL库实现温度采集 模块选择         ·STM32F103C8T6         ·MLX90614 非接触式红外测温传感器 编程环境         ·KEIL5(μVision V5.30.0.0) 其它

    2024年02月16日
    浏览(40)
  • 基于STM32CubeIDE HAL库利用基本定时器实现串口接收不定长数据

    ✨申明:本文章仅发表在 CSDN 网站,任何其他网见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 📌相关参考《HAL库教程9:串口接收不定长数据》 🎉对于串口接收不定长数据的处理方案网上有很多,个人觉得采用定时

    2024年02月09日
    浏览(56)
  • stm32 串口调试配置及printf重定向

    stm32使用串口调试打印时,需要对串口进行配置并对printf进行重定向,本文介绍如何配置串口以及printf重定向。 示例: 1、配置选项选中要配置的usart 2、模式选择异步模式,硬件流控制disable 3、配置串口参数 生成代码后可以在工程中usart.c中查看到串口相关代码 在工程配置中

    2024年02月11日
    浏览(58)
  • 关于STM32 hal printf重定向 “FILE“ is undefined

    关于STM32 hal printf重定向,及报错。“FILE” is undefined 增加以下内容:

    2024年02月13日
    浏览(43)
  • STM32-HAL库-printf函数重定向(简单易懂亲测有效)

    由于STM32cubemx生成的HAL库代码没有printf,为了让这个函数能实现打印功能,我们必须要把这个函数重定向,让它重定向到串口中,把要输出的内容打印到串口中。 配置好时钟后,选择你的串口,生成代码。 进入到STM32xxxhal.c中,加入如下两条语句,你的huart是数字几,后面就修

    2024年02月05日
    浏览(47)
  • STM32使用printf重定向到USART(串口)并打印数据到串口助手

    我们知道我们在进行编程的时候,遇到问题,经常通过打印信息进行调试,在java中使用的是System.out.println打印到输出窗口。在C语言中使用的是printf打印到输出窗口。而我们用keil进行编程的时候也是使用的C语言所以也可以使用printf,但是我们知道,keil中没有输出窗口。那我

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包