今天在做课程实验的时候为了方便数据的可视化,就想要将数据利用串口发给电脑进行显示。但是利用HAL_UART_Transmit函数的时候传输的数字都是hex格式,比如我想要发的是1,但实际ASCII显示出来可能是一个“?”这种。当然也不是不能直接用对应函数解决,比如我现在想发1,那我实际传输的数据应该就是0x31。但是这样很麻烦而且可能会遇到奇怪的bug。为了省事就想到了之前看到的串口函数重定向,就是利用我们都很熟悉的C语言中的printf函数进行数据打印在上位机显示。
在网上搜了很多,但是大部分都是基于Keil这个软件的,很不幸,本人目前所用的电脑上没有这个软件。关于在STM32CubeIDE上的串口函数重定向的文章很少。我在此就对我遇到的问题进行总结,也希望各位有缘看到的人能通过阅读这篇文章解决你们的问题。
首先我们再引入串口函数重定向的时候肯定是要引入一个库的
就是我们熟悉的:stdio.h
#include "stdio.h"
所谓的函数重定向,是指我们要通过改写fputc函数,进而实现对printf函数的重定向,下面是fputc函数重写的具体代码
/* USER CODE BEGIN 0 */
#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(&huart1,(uint8_t*)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
同时,在这里,我还是对stdio.h头文件中的fputc函数的声明进行了改写,改写成这样滴。
int fputc(int ch,FILE *f);
做完这些,我们程序部分的改写就到此为止。下面我们还需要对STM32cubeIDE进行一些配置,否则我们的printf函数依旧是无效的!!!
首先我们鼠标右键对应需要改写的工程,会出现这样的框
我们选择属性,会出现这样的情况
我们选到MPU setting这里,按照图示红线部分进行配置,一定要勾选!!!!不然可能没有办法使用浮点型喔。
然后我们再选到这里
在other flag中添加
-u_printf
然后我们选择应用并关闭,就可以在程序中利用printf函数进行打印了。
这里还有一个问题,就是我们写的printf函数必须必须必须要以\r\n结尾!!!!这个非常非常重要如果不以\n结尾是无效的,不会正常打印串口!!!!具体原因enmm我还不太了解,如果有大佬知道的话麻烦评论区给俺讲解一下。