单片机打印日志还能这么玩?一招秀翻同事

举报
小麦大叔 发表于 2021/12/05 00:22:06 2021/12/05
【摘要】 点击上方“小麦大叔”,选择“置顶/星标公众号” 福利干货,第一时间送达 大家好,我是小麦,这次分享一个小技巧,打印带颜色编码的日志,希望对你有所帮助。 log的重要性 在项目开发中,日志可以帮助我们调试和发现产品中潜藏的问题,比如在发生错误的时候,打印相应的日志,定位发生错误的位置,通常我们需要日志满足以下这些功能: 不...

点击上方“小麦大叔”,选择“置顶/星标公众号”

福利干货,第一时间送达

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

log的重要性

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

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

  • 能够设置日志级别;

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

  • 占用空间小;

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

  • 时间戳;

  • 易于集成;

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

打印彩色的log

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

dc591da5b1319e6704977411c6544b22.png

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


   
  1. #include <stdio.h>
  2. #define ANSI_COLOR_RED     "\x1b[31m"
  3. #define ANSI_COLOR_GREEN   "\x1b[32m"
  4. #define ANSI_COLOR_YELLOW  "\x1b[33m"
  5. #define ANSI_COLOR_BLUE    "\x1b[34m"
  6. #define ANSI_COLOR_MAGENTA "\x1b[35m"
  7. #define ANSI_COLOR_CYAN    "\x1b[36m"
  8. #define ANSI_COLOR_RESET   "\x1b[0m"
  9. int main (int argc, char const *argv[]) {
  10.         
  11.         printf(ANSI_COLOR_RED     "This text is RED!"     ANSI_COLOR_RESET "\r\n");
  12.         printf(ANSI_COLOR_GREEN   "This text is GREEN!"   ANSI_COLOR_RESET "\r\n");
  13.         printf(ANSI_COLOR_YELLOW  "This text is YELLOW!"  ANSI_COLOR_RESET "\r\n");
  14.         printf(ANSI_COLOR_BLUE    "This text is BLUE!"    ANSI_COLOR_RESET "\r\n");
  15.         printf(ANSI_COLOR_MAGENTA "This text is MAGENTA!" ANSI_COLOR_RESET "\r\n");
  16.         printf(ANSI_COLOR_CYAN    "This text is CYAN!"    ANSI_COLOR_RESET "\r\n");
  17.         return 0;
  18. }

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

295296ffc802b1e397a05aad76b97945.png 输出结果

ANSI转义序列

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

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

bb40b1ceb99fea2553d06f844bd54b67.png ascii码表

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

3923c15bb8831239e6ca22281ed3bd25.png 转自wiki

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

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


   
  1. #include <stdio.h>
  2. int main(){
  3.         for(int i = 0; i < 256; i++){
  4.                 printf("\x1b[48;5;%dm %03d \x1b[0m", i, i);
  5.                 if( i % 10 == 0){
  6.                         printf("\r\n");
  7.                 }
  8.         }
  9.         return 0;
  10. }

重点是这一句:printf("\x1b[48;5;%dm %03d \x1b[0m", i, i);简单分析一下;

  • 其中\x1b[ 是起始指令,后面的48表示设置背景色,38是前景色;

  • 48后面通常会跟一个;5;,这个是文档中规定的,第一个%d,是设置色号,最后以m结尾;

5a3fe5ad930f7215f44eb53721fd462d.png 参数设置
  • 第二个%03d是中间需要显示的文本;

  • 最后以\x1b[0m结束;

测试系统是Ubuntu 1804,最终的运行结果如下所示;

1f267a37c6ffeedf78cc3b80542b5efc.png 运行结果

单片机中实现

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

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

b53bc9e62f15873e72405e9252558ecf.png moba xterm中的结果

总结

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

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

—— The End ——

推荐好文  点击蓝色字体即可跳转

 状态机的三种骚操作,值得你了解

☞ 推荐一个直接用于项目开发的PID库!很好用,很稳定bcfaff87edf55737a83c2016a4e1e97c.gif

☞ 这14种嵌入式实时系统,你用过哪些?

☞ 推荐一款我私藏已久的串口示波神器

欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!

分享 💬  点赞 👍  在看 ❤️ 

以“三连”行动支持优质内容!

文章来源: great.blog.csdn.net,作者:小麦大叔,版权归原作者所有,如需转载,请联系作者。

原文链接:great.blog.csdn.net/article/details/120755927

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。