前言
stm32系列单片机中使用串口重定向打印,颜色都是黑底白字,颜色太单一,有时候我们想实现重大错误时使用红色打印,正常debug的输出使用绿色打印,类似于log等级那样,error使用红色,worn使用黄色,debug使用绿色,本文介绍一种基于串口重定向到printf的彩色输出打印方法。
一、STM32系列单片机的串口重定向
这一部分在我另一篇文章中有介绍,可参考STM32H753IIT6中使用printf打印数据
或者参考其他博主的优秀文章,本文中不再详细赘述,默认认为你已经实现了printf的黑底白字的打印。
二、实现printf的颜色输出
在工程中定义颜色相关的宏,如图所示:
#define NONE "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
#define GREEN "\033[0;32;32m"
#define LIGHT_GREEN "\033[1;32m"
#define BLUE "\033[0;32;34m"
#define LIGHT_BLUE "\033[1;34m"
#define DARY_GRAY "\033[1;30m"
#define CYAN "\033[0;36m"
#define LIGHT_CYAN "\033[1;36m"
#define PURPLE "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN "\033[0;33m"
#define YELLOW "\033[1;33m"
#define LIGHT_GRAY "\033[0;37m"
#define WHITE "\033[1;37m"
此时在main函数中写下验证代码,如下图所示:
printf(RED "hello,world, red\r\n" NONE);
printf(BLUE "hello,world, blue\r\n" NONE);
printf(GREEN "hello,world, green\r\n" NONE);
printf(YELLOW "hello,world, yellow\r\n" NONE);
HAL_Delay(1000);
然后编译代码,进行烧录下载,当程序运行后,打开串口助手如下
彩色打印成功!!!
三、代码优化
虽然上述操作确实可以输出彩色打印,但是每次彩色打印前总是要先printf(RED [输出内容] NONE);
这样才能输出想要的颜色。这样写太麻烦了,而且也不优雅,能不能把这个RED和NONE省略掉呢。
于是想到使用宏,我们可以像下面这样操作。如图所示:
#define printf_red(...) ({printf(RED);printf(__VA_ARGS__);printf(NONE); })
#define printf_blue(...) ({printf(BLUE);printf(__VA_ARGS__);printf(NONE); })
#define printf_green(...) ({printf(GREEN);printf(__VA_ARGS__);printf(NONE); })
#define printf_yellow(...) ({printf(YELLOW);printf(__VA_ARGS__);printf(NONE); })
四、验证优化代码
根据步骤3,写好打印颜色宏函数后,我们在main中编写如下代码,如图所示:
printf_red("hello,world\r\n");
printf_blue("hello,world\r\n");
printf_green("hello,world\r\n");
printf_yellow("hello,world\r\n");
HAL_Delay(1000);
写好后,我们编译代码,下载到开发板,然后打开串口助手,如图所示:
彩色输出成功!!!
五、总结
本文介绍了一种使用printf打印彩色输出的方法,只定义了部分颜色,还有其它很多种颜色,这一部分可参考其它博主的优秀文章,有了颜色输出,便可对工程中的日志管理有重大意义,用户可根据自己的喜好,结合宏定义写出自己工程中的log日志功能!!!