STM32—重定向printf和getchar函数到串口

发布者:HarmoniousCharm最新更新时间:2021-09-01 来源: eefocus关键字:STM32  重定向printf  串口 手机看文章 扫描二维码
随时随地手机看文章

在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。


以printf()为例:

printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。


那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。


修改fputc函数如示:


/* 重定向printf函数 */

int fputc(int ch, FILE *f)

{

USART_SendData( DEBUG_USARTx,  (uint8_t) ch);

/* 等待发送完毕 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); 

return ch;

}


修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include

在这里插入图片描述

getchar()函数也是如此:


/* 重定向scanf函数 */


int getc(FILE *f)

{

/* 等待串口输入数据 */

/* 有了这个等待就不需要在中断中进行了 */

while(USART_GetFlagStatus(DEBUG_USARTx , USART_FLAG_RXNE)==RESET);

/* 返回值进行强制类型转换 */

return (int)USART_ReceiveData(DEBUG_USARTx);

}


关键字:STM32  重定向printf  串口 引用地址:STM32—重定向printf和getchar函数到串口

上一篇:STM32—位带操作
下一篇:STM32—中断详解(配合按键中断代码,代码亲测)

推荐阅读最新更新时间:2024-11-13 23:23

串口工作在DMA模式下有时接收异常
1 前言 客户反馈在使用STM32F205的串口工作在DMA模式时,有时能够接收数据,有时完全没有数据,但如果换成中断模式来接收又能100%正常收到数据。 2 复现现象 2.1 问题背景 与客户沟通,客户使用的是STM32F2标准库V1.1.0,串口波特率为1.408Mbps,不经过串口RS232,直接连接主CPU和从MCU(STM32F205)的串口发送和接收引脚,如下图所示: 图1 2.2 尝试重现问题 由于客户使用的是主从架构,实验采用两块STM3220G-EVAL评估板来重现现象。一块用来不间断发送串口数据,另一块采用串口DMA进行接收,直接通过杜邦线连接串口PIN脚并共地,不使用评估板上的RS232收
[单片机]
<font color='red'>串口</font>工作在DMA模式下有时接收异常
关于stm32串口重定向问题详解
usart这部分代码我也是从网上copy出来的,一下是作者的解释: 简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker- Libraries- Small printf set to 'Yes') calls
[单片机]
PC串口通信的测温系统的单片机实现方案
  温度是工业控制中主要的被控参数之一,温度的检测及控制传统方法多以热电阻和热电偶等为温度传感元件,而这种模拟温度传感器输出为模拟信号,必须经过A/D 转换环节获得数字信号后才能与单片机等微处理器接口,使得硬件电路结构比较复杂、抗干扰性差、布线麻烦以及成本高等缺点。   针对上述问题,该设计提出了基于Dallas 半导体公司的数字式温度传感器DS18B20 和ATMEL 公司AT89S52 单片机构成的温度测量系统,并可通过串口连接在PC 系统上进行实时显示,该系统安装简易,可靠性高,适用于恶劣环境的现场温度测量。   1 系统构成   测温系统由微控制器、温度采集、串口通信、LCD 显示和上位机显示等几部分组成,如图1 所
[单片机]
PC<font color='red'>串口</font>通信的测温系统的单片机实现方案
解决STM32单片机的ADC采样不准确偏移的问题
项目场景: 用STM32CubeMX生成的ADC采样测量电压。 单片机:STM32G070 MDK:V5.25 问题描述: 采样回来的数值Debug看总是大了些许,几个通道都是这样,具体测试情况如下: 原因分析: 翻阅对比官方历程检查发现没有ADC校准,STM32CubeMX不会自动帮你配置校准。 /* Run the ADC calibration */ if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) { /* Calibration Error */ Error_Handler(); } /* USER CODE END 2 */ /*
[单片机]
解决<font color='red'>STM32</font>单片机的ADC采样不准确偏移的问题
利用STM32单片机串口发送字符串
最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。 其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。 //程序功能:利用串口发送一个字符串 // 参数:USARTx USART编号 可取 USART1、USART2、USART3、USART4、 USART5(STM32F103ZET6) str 需要发送的字符串 #include “stm32f10x.h” void Usart_SendString(USART_TypeDef* US
[单片机]
51单片机 串口
串口这货,重要性就不用说了。哪里有单片机,哪里就有串口了。 直接上代码: #include #define uint unsigned int #define uchar unsigned char uint flag; //串口中断标志变量 uchar accept_data; //串口接收到的数据 uint i; //用于把 I get 六个字符型数据发送出去 uchar code table = I get ; //字符型编码数组 void init();
[单片机]
关于STM32的com事件概念
COM事件是专门为电机控制用的,它只出现在高级定时器TIM1和TIM8中,普通定时器TIM2~TIM4没有COM事件。 COM事件是用于同时控制所有通道的输出转换,在电机控制中同时转换所有通道的输出是十分必要的 比如无刷电机换向时,一般是三相要同时换向的,但是你在软里设置换向时肯定是一次只能设置一相,这就达不到三相同时换向了不。其实简单的办法就是启用 STM32的COM事件,你先逐个设置好每相的换向(注意:此时虽然设置了,但实际上并不会进行换向),然后再调用COM事件,此时,三相将同时换向,就这么来的。阿呆版主,这够清楚了吧 COM事件发生在STM32的高级控制定时器(TIM1、TIM8)的 六步PWM的产生 ,而6-step P
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved