使用Printf函数格式化输出彩色字符

效果展示:

printf函数可以说是大家日常调试代码尤其是debug过程中使用最多的函数之一了

我们可以通过printf的格式化功能,打印出多重颜色的数据,让你在茫茫字符中一眼找到你所需要的关键数据。使用例如下:

image-20220712200603094

这张图是在Xshell中的效果,其实支持这种字符颜色的串口工具很多,再举一例,如Vofa:

image-20220712200714983

不过这里黄色显得有些不清晰了,问题不大,修改就行了

实现方式:

首先创建一个.h文件作为储存颜色代码的库,方便快速调用。具体的代码如下:

#ifndef SRC_COLOR_H_
#define SRC_COLOR_H_

#define NONE                  "\e[0m"           //清除颜色,即之后的打印为正常输出,之前的不受影响
#define BLACK                 "\e[0;30m"         //深黑
#define L_BLACK             "\e[1;30m"            //亮黑,偏灰褐
#define RED                     "\e[0;31m"      //深红,暗红
#define L_RED                 "\e[1;31m"        //鲜红
#define GREEN                "\e[0;32m"         //深绿,暗绿
#define L_GREEN            "\e[1;32m"           //鲜绿
#define BROWN               "\e[0;33m"          //深黄,暗黄
#define YELLOW              "\e[1;33m"          //鲜黄
#define BLUE                    "\e[0;34m"      //深蓝,暗蓝
#define L_BLUE                "\e[1;34m"        //亮蓝,偏白灰
#define PURPLE               "\e[0;35m"         //深粉,暗粉,偏暗紫
#define L_PURPLE           "\e[1;35m"           //亮粉,偏白灰
#define CYAN                   "\e[0;36m"       //暗青色
#define L_CYAN               "\e[1;36m"         //鲜亮青色
#define GRAY                   "\e[0;37m"       //灰色
#define WHITE                  "\e[1;37m"       //白色,字体粗一点,比正常大,比bold小
#define BOLD                    "\e[1m"         //白色,粗体
#define UNDERLINE         "\e[4m"               //下划线,白色,正常大小
#define BLINK                   "\e[5m"         //闪烁,白色,正常大小
#define REVERSE            "\e[7m"              //反转,即字体背景为白色,字体为黑色
#define HIDE                     "\e[8m"        //隐藏
#define CLEAR                  "\e[2J"          //清除
#define CLRLINE               "\r\e[K"          //清除行

#endif /* SRC_COLOR_H_ */`

在需要使用printf的文件头部引用这个.h文件即可使用,具体使用方式,是在printf的格式化部分添加需要的格式,例如

printf("Cacu y/x ->"YELLOW "%f"NONE" \r\n", phase);

其中,第一段字符为"Cacu y/x ->",通过YELLOW切换到黄色打印模式。第二段字符为"%f",用于打印所需的浮点数。随后通过NONE字符清除颜色,即之后的打印为正常输出,之前的则不受影响。最后一段再打印换行符" \r\n"。

同样的,再执行以下函数就可以实现上一节中的打印效果,十分的简单便捷。

printf("Simulated DATA -> " RED "i: %05d " BLUE " q: %05d "NONE "\r\n" , i_data, q_data);

CSDN上广为流传的一种例程中,还打印了当前行号,如果大家需要也可做参考使用

#include 
#include 
int print_test(void)
{
    printf("This is a character control test!\n" );
    printf("[%2u]" CLEAR "CLEAR\n" NONE, __LINE__);
    printf("[%2u]" BLACK "BLACK " L_BLACK "L_BLACK\n" NONE, __LINE__);
    printf("[%2u]" RED "RED " L_RED "L_RED\n" NONE, __LINE__);
    printf("[%2u]" GREEN "GREEN " L_GREEN "L_GREEN\n" NONE, __LINE__);
    printf("[%2u]" BROWN "BROWN " YELLOW "YELLOW\n" NONE, __LINE__);
    printf("[%2u]" BLUE "BLUE " L_BLUE "L_BLUE\n" NONE, __LINE__);
    printf("[%2u]" PURPLE "PURPLE " L_PURPLE "L_PURPLE\n" NONE, __LINE__);
    printf("[%2u]" CYAN "CYAN " L_CYAN "L_CYAN\n" NONE, __LINE__);
    printf("[%2u]" GRAY "GRAY " WHITE "WHITE\n" NONE, __LINE__);
    printf("[%2u]" BOLD "BOLD\n" NONE, __LINE__);
    printf("[%2u]" UNDERLINE "UNDERLINE\n" NONE, __LINE__);
    printf("[%2u]" BLINK "BLINK\n" NONE, __LINE__);
    printf("[%2u]" REVERSE "REVERSE\n" NONE, __LINE__);
    printf("[%2u]" HIDE "HIDE\n" NONE, __LINE__);

    printf(GREEN "csdsafsfsdfsdfsadffsda \n\n");    
    printf(L_RED "L_RED\n");
    printf(NONE "xxxxxxx");
    return 0;

}

int main()
{
    print_test();
    return 0;
} 

输出效果同样很好看~

在这里插入图片描述

发表回复