# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一

# 关于软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一,第1张

# 软件stm32cubeIDE下配置printf重定向无法输出问题-解决方式之一
  • (1)前言
  • (2)问题链接
  • (3)问题描述
  • (4)我做过的努力与尝试
  • (5)后续与参照
  • (6)解决办法
  • (7)代码链接
  • (8)后期验证
  • (9)后期补充

(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
//STM32cubeIDE下
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart3 , (uint8_t *)&ch, 1,0x200);
    return ch;
}

//keil下 //没在keil下尝试过 一直使用软件stm32cubeIDE没有取keil验证
//UART_HandleTypeDef huart1; //UART句柄
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"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */
//>>第二步:定义数组
uint8_t u_buf[64];

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//>>第三步:定义输出函数printf
#define printf(...)  HAL_UART_Transmit_DMA((UART_HandleTypeDef * )&huart3, (uint8_t *)u_buf,\
											sprintf((char *)u_buf,__VA_ARGS__));
/* USER CODE END PTD */

//>>第四步:打印输出
	  	  printf("abscdasdf");
		  HAL_Delay(1000);
(7)代码链接

测试使用的代码:https://download.csdn.net/download/qq_22146161/85232365

(8)后期验证

如下是串口打印结果。

(9)后期补充

在实际使用的时候其实想要打印浮点数的,在测试历程里打印正常能够printf打印出来,但是发现在使用RT-thread里却很困难,通过自己测试还是成功打印出来,将在历程打印和RT-thead分别记录下来。
(1)使用打印浮点数float小数。


//>>第四步:float打印输出
	  	  printf("ADC0=%d\r\n",abc_buf[0]); //原始值
	  	HAL_Delay(100);
	  	  printf("voltage0:%f\r\n",(float)abc_buf[0]/4096*3.3); //转换的电压值
		  HAL_Delay(1000);

	  	  printf("ADC1=%d\r\n",abc_buf[1]);
	  	HAL_Delay(100);
	  	  printf("voltage1:%f\r\n",(float)abc_buf[1]/4096*3.3);
		  HAL_Delay(1000);

	  	  printf("ADC2=%d\r\n",abc_buf[2]);
	  	HAL_Delay(100);
	  	  printf("voltage2:%f\r\n",(float)abc_buf[2]/4096*3.3);
		  HAL_Delay(1000);

(2)在RT-thread上打印浮点数:使用时记得强制转换,主要是使用sprintf合成字符串打印

		//原始值
		// LOG_I("<(1)ADC_PA1:_%d_(2)ADC_PA2:_%d_(3)ADC_PA3:_%d_>",g_wADC_measurement_value_buf[0], \
				 g_wADC_measurement_value_buf[1],g_wADC_measurement_value_buf[2] );
		// rt_thread_mdelay(1000);
		sprintf(str1, "<(1)Charge_voltage:%f(2)Charge_:%f (3)Charge_:%f >",(float)g_wADC_measurement_value_buf[0]/4095*3.3, \
				(float)g_wADC_measurement_value_buf[1]/4095*3.3,(float)g_wADC_measurement_value_buf[2]/4095*3.3 );

		 //转换值
		 LOG_I("%s",str1);

		//LOG_I("this is PSB_log_test data"); //uart3 发送
		rt_thread_mdelay(1000);

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/791372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存