- (1)前言
- (2)问题链接
- (3)问题描述
- (4)我做过的努力与尝试
- (5)后续与参照
- (6)解决办法
- (7)代码链接
- (8)后期验证
- (9)后期补充
最近在使用STM32cubeIDE调试ADC+DMA测量引脚电压,想使用printf打印 一些信息,自己之前也使用过printf重定向,但是发现这次无论怎么尝试都无法使用了,后来直接HAL库下的串口直接输出,然后在问答看看能不能解决,就继续调试ADC去了,后来在查ADC的文章中,看到一种解决方法,测试过后,发现好用。叙述完了,直接看解决办法, 直接跳到那里就行.
(2)问题链接具体的“问答”如下链接,将所遇到问题描述了下,不想跳转直接看我以下描述也行。
问答链接:https://ask.csdn.net/questions/7701670
在使用STM32cubeIDE调试STM32F103时,准备使用uart3串口打印信息,因为有打印需求,想使用printf重定向,之前使用的F4开发板,加入了重定向代码后,F4能够直接printf打印,所以将代码直接移植到F1上,发现无法打印,但是使用uart3串口HAL库函数能够打印,但是printf不行,如下截图为代码打印方式,对比printf和HAL。
以下为输出结果,可以看到只是输出”1234“,没有“hehe”,说明printf没有成功。
查找网上资料后,几乎只要搜索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浮点型输出问题。
后来,我想输出不一定非要printf,用hal库提供函数也行,不是刚需,就调试ADC去了,看文章过程中,有其他方式printf,尝试过后,成功了,也是有了这边文章。
参考链接:https://blog.csdn.net/weixin_45488643/article/details/108164547
如下所示,将关键代码提出来了,想要全部代码,可以看代码链接。
简单说:也是引入相应的库,然后链接,不过这次不是用的重定向,而是#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)后期验证如下是串口打印结果。
在实际使用的时候其实想要打印浮点数的,在测试历程里打印正常能够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);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)