本项目使用到的软件
1. stm32cubeMX
2. keil
3. 串口助手
*以下所有带代码均在keil中编写,项目的初始化和生成都由stm32cubeMX生成。
1.缘由
在stm32单片机中,printf函数是无法打印到控制台的。为了让这个函数能实现打印功能,我们必须要把这个函数重定向,让它重定向到串口中,把要输出的内容打印到串口中。为此需要以下几步。
2操作步骤
在main.c中添加如下代码
#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(&huart1,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印,串口1
return ch;
}
3验证方式
为了验证printf函数有没有重定向到串口,以下是我的验证方式
在main函数中添加如下代码:
int main(void)
{
uint8_t rh = 11;
float x = 1.1234;
double y = 2.345;
printf("hello!你好!\r\n");
printf("rh:%d\r\n",rh);
printf("x:%.2f\n\r",x);
printf("y:%f\n\r",y);
while(1)
{
}
}
可观察到串口助手已经打印出正确文字和变量,浮点型和整型变量都能打印。
4遇到的坑
如果你们发现在正常运行中,打印不出来,可以这样判断一下:先进入debug模式中,运行,看printf函数有没有进入死循环,如果能往下执行,并且串口能打印出来。 那就说明你没有使用MicroLIB库。
解决方法:在keil中点击下如下按钮 ,进入项目参数设置界面
勾上“Use MicroLIB”选项即可,然后重新编译,烧录。即可正常打印。
如果在debug中,printf函数是死循环的。应该是printf重定向这方面没实现。
5结尾
如果中文打印乱码,则是字符编码设置出错了。keil设置如下,选择GB2312编码格式。
如果串口工具打印的中文还是乱码,则在串口工具中也设置一下编码方式,具体如下:
最后,分享一下自己写的打印浮点类型函数。
#include <stdio.h>
#include <math.h>
/***************
* 打印浮点类型
* @param(data)要打印的浮点数
* @param(precision)小数点精度(小数点后几位)
* ******************/
void printf_float(double data,uint8_t precision){
uint8_t num = 0;
uint32_t data_int = (uint32_t)data;
uint32_t data_float = 0;
printf("%d",data_int);
printf(".");
while(num<precision){
data_float = (uint32_t )(data*pow(10,num+1))%10;
printf("%d",data_float);
num++;
}
}
如有写错或者各种想法,请说出来,我将及时改正。多多交流。