你还在渴望办公室恋情?学会单片机打印日志一招秀翻同事

2022-04-03   大方老师单片机

原标题:你还在渴望办公室恋情?学会单片机打印日志一招秀翻同事

你还在渴望办公室恋情?学会单片机打印日志一招秀翻同事

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

·不同的日志级别(TraceWarningInfoErrorfatal);

·能够设置日志级别;

·基于日志级别的颜色编码;

·占用空间小;

·可配置,可以完全禁用它;

·时间戳;

·易于集成;

下面我们介绍一下如何在串口上打印出不同颜色的字符串。

打印彩色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 %03d \x1b[0m", i, i);

if( i % 10 == 0){

printf("\r\n");

}

}

return 0;

}

重点是这一句: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串口终端,可以正常显示设置前景色的字符串,结果符合预期。

我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免费的,简介里就有,或者留意下方评论第一条(私信我也可以~