历史上的今天
今天是:2025年12月09日(星期二)
2022年12月09日 | 单片机打印日志还能这么玩?一招秀翻~
2022-12-09 来源:zhihu
分享一个小技巧,打印带颜色编码的日志,希望对你有所帮助。
log的重要性
在项目开发中,日志可以帮助我们调试和发现产品中潜藏的问题,比如在发生错误的时候,打印相应的日志,定位发生错误的位置,通常我们需要日志满足以下这些功能:
不同的日志级别(Trace、Warning、Info、Error、fatal);
能够设置日志级别;
基于日志级别的颜色编码;
占用空间小;
可配置,可以完全禁用它;
时间戳;
易于集成;
下面,我们介绍一下如何在串口上打印出不同颜色的字符串。
打印彩色的log
在Stack Overflow上有人提出过类似的问题,如何在终端打印出彩色的字符?

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

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

输出结果
ANSI转义序列
ANSI转义序列(ANSI escape sequences)是一种带内信号的转义序列标准,用于控制视频文本终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以ESC转义字符和"["字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。
所以,这里我们查了一下ascii码表,可以发现ESC的码值是十进制的27,也就是十六进制的0x1b,具体如下所示:

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

转自wiki
可以参考文档:https://invisible-island.net/xterm/ctlseqs/ctlseqs.html
所以这里简单举个例子,设置不同的背景色:

重点是这一句:printf("x1b[48;5;%dm %03d x1b[0m", i, i);简单分析一下:
其中x1b[ 是起始指令,后面的48表示设置背景色,38是前景色;
48后面通常会跟一个;5;,这个是文档中规定的,第一个%d,是设置色号,最后以m结尾;

参数设置
第二个%03d是中间需要显示的文本;
最后以x1b[0m结束。
测试系统是Ubuntu 1804,最终的运行结果如下所示:

运行结果
单片机中实现
单片机可以将日志通过串口打印出来,这时候需要显示彩色字符,需要一个前提,就是串口终端软件需要支持解析ANSI转义序列。
下面我做了简单的实验,通过STM32的串口,发送相应的字符,然后在PC端使用MobaXterm软件打开串口并接收数据;因为这个软件是支持ANSI序列的,所以最终可以显示出不同颜色的字符串。具体如下所示:

moba xterm中的结果
总结
本文介绍了如何打印彩色字符串,其中简单介绍了ANSI转义序列,并且给出了几个小的实验结果,并在单片机上发送字符串到PC上,使用xterm串口终端,可以正常显示设置前景色的字符串,结果符合预期。
下一篇:单片机程序代码该如何优化?
史海拾趣
|
发帖发问一个bootloader问题并邀请学习6410,PXA3XX等高级货的同志了! 这几天看了6410的eboot,并对nk.bin以及nk.nb0文件重新了解了一下,发现了很多疑问。 主要是我以前一直用ADS bootloader,现在觉得两者有不可思议的差别。 一、ADS bootloader没有拷贝全局变量到RAM的行为,但是eboot.nb0有——但是这两个格式的 ...… 查看全部问答> |
|
如题。用的2450的板子,wince5.0的平台。现在用IIC1接我的IC芯片。现在拿到手的IIC驱动是IIC0的,即用的GPE14\\GPE15,我需要将其换成IIC1,即GPB7\\GPB8。我做了如下修改: 1、 WINCE500\\PLATFORM\\SMDK2450\\Src\\Drivers\\IIC\\i2c.c中 //#de ...… 查看全部问答> |
|
我用的优龙YL2410开发板,最近想自己制作一个cramfs跟文件系统,参考网上比较著名的一个文档《Linux系统移植》的根文件系统制作部分自己制作了一个cramfs的文件系统my_rootfs.cramfs,其中busybox使用的是1.1.3。把my_rootfs.cramfs烧写到板子后发 ...… 查看全部问答> |
|
wince5.0 S3c2440官方bsp,带camera驱动 wince5.0 S3c2440官方bsp,带camera驱动: http://www.itxxh.cn/book/2440/zaxsw1565.shtml WINCE5.0系统下,OV9650 CAMERA驱动程序: http://www.itxxh.cn/book/2440/zaxsw1568.shtml… 查看全部问答> |
|
Bit-banding 又称为:极细微的位处理操作, 精确的位操作,位别名区。 为了减少读-修改-写(RMW)操作的时间,ARM在Cortex-M3处理器中引入了bit-banding技术。在bit-banding使能的处理器中,存储器映射的特定区域(SRAM和外设区)能够使用地址别 ...… 查看全部问答> |




