0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机中如何实现打印彩色字符串

Q4MP_gh_c472c21 来源:小麦大叔 作者:小麦大叔 2021-11-18 11:31 次阅读

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

log的重要性

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

  • 不同的日志级别(TraceWarningInfoErrorfatal);
  • 能够设置日志级别;
  • 基于日志级别的颜色编码;
  • 占用空间小;
  • 可配置,可以完全禁用它;
  • 时间戳;
  • 易于集成;

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

打印彩色的log

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

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

#include

#defineANSI_COLOR_RED"x1b[31m"
#defineANSI_COLOR_GREEN"x1b[32m"
#defineANSI_COLOR_YELLOW"x1b[33m"
#defineANSI_COLOR_BLUE"x1b[34m"
#defineANSI_COLOR_MAGENTA"x1b[35m"
#defineANSI_COLOR_CYAN"x1b[36m"
#defineANSI_COLOR_RESET"x1b[0m"

intmain(intargc,charconst*argv[]){

printf(ANSI_COLOR_RED"ThistextisRED!"ANSI_COLOR_RESET"
");
printf(ANSI_COLOR_GREEN"ThistextisGREEN!"ANSI_COLOR_RESET"
");
printf(ANSI_COLOR_YELLOW"ThistextisYELLOW!"ANSI_COLOR_RESET"
");
printf(ANSI_COLOR_BLUE"ThistextisBLUE!"ANSI_COLOR_RESET"
");
printf(ANSI_COLOR_MAGENTA"ThistextisMAGENTA!"ANSI_COLOR_RESET"
");
printf(ANSI_COLOR_CYAN"ThistextisCYAN!"ANSI_COLOR_RESET"
");

return0;
}

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

ANSI转义序列

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

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

3fc5e212-481b-11ec-b939-dac502259ad0.pngascii码表

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

401d621c-481b-11ec-b939-dac502259ad0.png转自wiki

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

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

#include

intmain(){

for(inti=0;i< 256;i++){

printf("x1b[48;5;%dm%03dx1b[0m",i,i);

if(i%10==0){
printf("
");
}
}
return0;
}

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

  • 其中x1b[ 是起始指令,后面的48表示设置背景色,38是前景色;
  • 48后面通常会跟一个;5;,这个是文档中规定的,第一个%d,是设置色号,最后以m结尾;
403fcbd6-481b-11ec-b939-dac502259ad0.png参数设置
  • 第二个%03d是中间需要显示的文本;
  • 最后以x1b[0m结束。

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

单片机中实现

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

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

总结

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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6044

    文章

    44632

    浏览量

    639406
  • 终端
    +关注

    关注

    1

    文章

    1160

    浏览量

    30065
  • 日志
    +关注

    关注

    0

    文章

    139

    浏览量

    10690

原文标题:单片机打印日志还能这么玩?一招秀翻~

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    字符串在数据库的存储方式

    数据库是现代信息技术存储和管理数据的核心组件。字符串作为最常见的数据类型之一,在数据库的存储方式对其性能和可扩展性有着重要影响。 数据类型 固定长度字符串 :如CHAR类型,它为每
    的头像 发表于 01-07 15:41 222次阅读

    字符串在编程的应用实例

    常以字符串的形式出现。例如,在命令行程序,用户输入的命令和参数都是字符串。 输出信息 :程序也经常需要向用户显示信息,这些信息同样可以以字符串的形式呈现。例如,
    的头像 发表于 01-07 15:33 169次阅读

    字符串字符数组的区别

    在编程语言中,字符串字符数组是两种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有一定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示 字符串 字符串
    的头像 发表于 01-07 15:29 341次阅读

    字符串反转的实现方式

    在编程字符串反转是一个基础而重要的操作,它涉及到将一个字符串字符顺序颠倒过来。这个操作在多种编程语言中都有不同的
    的头像 发表于 01-07 15:27 234次阅读

    字符串处理方法 字符串转数字的实现

    在编程,将字符串转换为数字是一个常见的需求。不同的编程语言有不同的方法来实现这一功能。以下是一些常见编程语言中的字符串转数字的实现方法:
    的头像 发表于 01-07 15:26 225次阅读

    base64字符串转换为二进制文件

    Base64是一种编码方法,用于将二进制数据转换为ASCII字符串。这种编码通常用于在不支持二进制数据的系统传输数据,例如电子邮件或网页。将Base64字符串转换为二进制文件的过程相对简单,但需要
    的头像 发表于 11-10 10:55 1785次阅读

    labview字符串数组转化为数值数组

    在LabVIEW,将字符串数组转换为数值数组是一项常见的任务,尤其是在处理数据采集、信号处理或用户输入时。 1. 理解LabVIEW的数据类型 在开始之前,了解LabVIEW的数据类型是非
    的头像 发表于 09-04 17:47 2976次阅读

    labview字符串如何转换为16进制字符串

    在LabVIEW,将字符串转换为16进制字符串是一个常见的需求,尤其是在处理数据通信和硬件接口时。LabVIEW提供了多种方法来实现这一转换,包括使用内置函数、编写VI(Virtua
    的头像 发表于 09-04 15:54 3148次阅读

    labview如何实现字符串换行

    1. 字符串换行的基本概念 在LabVIEW字符串换行通常指的是在字符串插入换行符,使得字符串
    的头像 发表于 09-04 15:47 2143次阅读

    labview如何实现字符串选择输出

    在LabVIEW实现字符串选择输出是一项常见的任务,它涉及到字符串处理、条件判断和用户界面设计等多个方面。由于LabVIEW是一种图形化编程语言,其编程方式与传统的文本编程语言有所不
    的头像 发表于 09-04 15:44 1135次阅读

    labview中常用的字符串函数有哪些?

    在LabVIEW,常用的字符串函数广泛覆盖了对字符串的各种操作,包括但不限于格式化、搜索、替换、连接、计算长度等。以下是一些常用的字符串函数及其简要说明:
    的头像 发表于 09-04 15:43 1032次阅读

    labview字符串的四种表示各有什么特点

    。在LabVIEW字符串是一种基本的数据类型,用于表示文本信息。字符串在LabVIEW中有多种表示方式,每种方式都有其特定的应用场景和特点。以下是对LabVIEW四种
    的头像 发表于 09-04 15:40 741次阅读

    rtt studio终端无法打印字符串是怎么回事?

    求助:rtt studio新创建的项目使用自带终端可以打印字符串,但是将字符串输出语句注释掉再改回来终端就无法打印了,并且msh也未显示也无法使用输入,使用其他的串口调试助手看到了rtt的界面以及
    发表于 07-05 07:29

    鸿蒙TypeScript学习第10天:【String(字符串)】

    String 对象用于处理文本(字符串)。
    的头像 发表于 04-08 14:32 906次阅读
    鸿蒙TypeScript学习第10天:【String(<b class='flag-5'>字符串</b>)】

    C语言字符串编译函数介绍

    在C语言中,字符串实际上是使用null字符O'终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成字符串
    的头像 发表于 03-07 16:18 564次阅读
    C语言<b class='flag-5'>字符串</b>编译函数介绍