为什么要使用重定向printf
C语言中经常使用printf来输出调试信息,打印到屏幕。由于在单片机中没有屏幕,但是我们可以重定向printf,把数据打印到串口,从而在电脑端接收调试信息。这是除了debug外,另外一个非常有效的调试手段
但是由于使用编译的c语言不是官方定义的哪个版本
直接跳转解决方案:解决问题的方法
开发环境
- Clion 24年版本
- 使用STM32cubeMX进行项目初始化
- HAL官方库
- arm-none-eab
问题
使用Clion进行串口调试的时候发现 已经进行fputc的重写还是没有向串口控制台返回数据
经过查资料发现都是配置keil的教程 但是还是找到了稚晖君的文章找到了原因 具体不赘述可以看稚晖君的文章他使用的是标准库 我这边使用的是hal库 hal库里面syscalls.c重写了稚晖君文章里的函数
使用KEIL设置是需要勾选USE MicroLIB
但是Clion并没有这个功能所以我们需要手动配置
解决问题的方法
#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, HAL_MAX_DELAY);
return ch;
}
直接粘贴到hal库的usart.c文件的里面
接着回到main方法里
HAL_Delay(1000);
printf("你好!!\n");
printf("%.2f\n",1.52);
还是这几句代码 接着编译烧录