# 软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一
(1)前言
最近在使用STM32cubeIDE调试ADC+DMA测量引脚电压,想使用printf打印 一些信息,自己之前也使用过printf重定向,但是发现这次无论怎么尝试都无法使用了,后来直接HAL库下的串口直接输出,然后在问答看看能不能解决,就继续调试ADC去了,后来在查ADC的文章中,看到一种解决方法,测试过后,发现好用。叙述完了,直接看解决办法, 直接跳到那里就行.
(2)问题链接
具体的“问答”如下链接,将所遇到问题描述了下,不想跳转直接看我以下描述也行。 问答链接:https://ask.csdn.net/questions/7701670
(3)问题描述
在使用STM32cubeIDE调试STM32F103时,准备使用uart3串口打印信息,因为有打印需求,想使用printf重定向,之前使用的F4开发板,加入了重定向代码后,F4能够直接printf打印,所以将代码直接移植到F1上,发现无法打印,但是使用uart3串口HAL库函数能够打印,但是printf不行,如下截图为代码打印方式,对比printf和HAL。 以下为输出结果,可以看到只是输出”1234“,没有“hehe”,说明printf没有成功。
(4)我做过的努力与尝试
查找网上资料后,几乎只要搜索printf重定向相关问题,解决都是差不多,既然网上结果如此统一,说明这种方法是有效的,将两种方法写在下面,也算作解决方式之一,不过我这不知道什么原因确实没能成功,没有找到原因。 (1)重定向方式:简单说,加入如下代码,一同编译,然后就能使用printf了,这部分代码我之前在F4就调试过,直接放在下面了。
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1,0x200);
return ch;
}
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart3,(uint8_t*)&ch,1,0xffff);
return ch;
}
(2)方式二:勾选库,这种方法看起来更多是要解决输出浮点数的问题。 如下图,项目上右键,然后选择properties. 进入如下界面,有几个选项,基本都尝试过了,没有成功,但这个更多是解决float浮点型输出问题。
(5)后续与参照
后来,我想输出不一定非要printf,用hal库提供函数也行,不是刚需,就调试ADC去了,看文章过程中,有其他方式printf,尝试过后,成功了,也是有了这边文章。 参考链接:https://blog.csdn.net/weixin_45488643/article/details/108164547
(6)解决办法
如下所示,将关键代码提出来了,想要全部代码,可以看代码链接。 简单说:也是引入相应的库,然后链接,不过这次不是用的重定向,而是#define链接一起了。
#include "string.h"
#include "stdint.h"
uint8_t u_buf[64];
#define printf(...) HAL_UART_Transmit_DMA((UART_HandleTypeDef * )&huart3, (uint8_t *)u_buf,\
sprintf((char *)u_buf,__VA_ARGS__));
printf("abscdasdf");
HAL_Delay(1000);
(7)代码链接
测试使用的代码:https://download.csdn.net/download/qq_22146161/85232365
(8)后期验证
如下是串口打印结果。
|