当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]关注「嵌入式大杂烩」,选择「星标公众号」一起进步!大家好,我是ZhengN。日志打印使我们日常开发密切接触的,之前也有分享过很多打印调试的文章。这次分享一个小技巧,打印带颜色编码的日志,希望对你有所帮助。log的重要性在项目开发中,日志可以帮助我们调试和发现产品中潜藏的问题,比如...

关注「嵌入式大杂烩」,选择「星标公众号」一起进步!




大家好,我是ZhengN。日志打印使我们日常开发密切接触的,之前也有分享过很多打印调试的文章。


这次分享一个小技巧,打印带颜色编码的日志,希望对你有所帮助。


log的重要性

在项目开发中,日志可以帮助我们调试和发现产品中潜藏的问题,比如在发生错误的时候,打印相应的日志,定位发生错误的位置,通常我们需要日志满足以下这些功能:


  • 不同的日志级别(Trace、Warning、Info、Error、fatal);
  • 能够设置日志级别;
  • 基于日志级别的颜色编码;
  • 占用空间小;
  • 可配置,可以完全禁用它;
  • 时间戳;
  • 易于集成;
下面我们介绍一下如何在串口上打印出不同颜色的字符串。


打印彩色的log

在Stack Overflow上有人提出过类似的问题,如何在终端打印出彩色的字符?


这里给出了一个很简单的C程序demo,我测试了一下,确实可以实现;


#include

#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_YELLOW "\x1b[33m"
#define ANSI_COLOR_BLUE "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN "\x1b[36m"
#define ANSI_COLOR_RESET "\x1b[0m"

int main (int argc, char const *argv[]) {

printf(ANSI_COLOR_RED "This text is RED!" ANSI_COLOR_RESET "\r\n");
printf(ANSI_COLOR_GREEN "This text is GREEN!" ANSI_COLOR_RESET "\r\n");
printf(ANSI_COLOR_YELLOW "This text is YELLOW!" ANSI_COLOR_RESET "\r\n");
printf(ANSI_COLOR_BLUE "This text is BLUE!" ANSI_COLOR_RESET "\r\n");
printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\r\n");
printf(ANSI_COLOR_CYAN "This text is CYAN!" ANSI_COLOR_RESET "\r\n");

return 0;
}

最终编译之后运行得到的结果如下,发现打印的字符颜色发生了变化;


输出结果

ANSI转义序列

ANSI转义序列(ANSI escape sequences)是一种带内信号的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以ESC转义字符和"["字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。


所以这里我们查了一下ascii码表,可以发现ESC的码值是十进制的27,也就是十六进制的0x1b,具体如下所示;


ascii码表所以转义序列的格式如下;


转自wiki可以参考文档:https://invisible-island.net/xterm/ctlseqs/ctlseqs.html


所以这里简单举个例子,设置不同的背景色;


#include

int main(){

for(int i = 0; i < 256; i ){

printf("\x1b[48;5;%dm d \x1b[0m", i, i);

if( i % 10 == 0){
printf("\r\n");
}
}
return 0;
}
重点是这一句:printf("\x1b[48;5;%dm d \x1b[0m", i, i);简单分析一下;


  • 其中\x1b[是起始指令,后面的48表示设置背景色,38是前景色;
  • 48后面通常会跟一个;5;,这个是文档中规定的,第一个%d,是设置色号,最后以m结尾;
参数设置
  • 第二个d是中间需要显示的文本;
  • 最后以\x1b[0m结束;
测试系统是Ubuntu 1804,最终的运行结果如下所示;


运行结果

单片机中实现

单片机可以将日志通过串口打印出来,这时候需要显示彩色字符,需要一个前提,就是串口终端软件需要支持解析ANSI转义序列。


下面我做了简单的实验,通过STM32的串口,发送相应的字符,然后在PC端使用MobaXterm软件打开串口并接收数据;因为这个软件是支持ANSI序列的,所以最终可以显示出不同颜色的字符串。具体如下所示;


moba xterm中的结果

总结

本文介绍了如何打印彩色字符串,其中简单介绍了ANSI转义序列,并且给出了几个小的实验结果,并在单片机上发送字符串到PC上,使用xterm串口终端,可以正常显示设置前景色的字符串,结果符合预期。


作者水平和能力有限,文中难免存在不足之处,请不吝赐教。如果本文对你有所帮助,不妨给个三连。



—— The End ——往期推荐:


LCD接口类型多种多样,如何区分?


聊聊你对嵌入式行业的看法?


在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。



点击阅读原文,查看更多分享。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭