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


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

    关注

    6078

    文章

    45580

    浏览量

    673683
  • 终端
    +关注

    关注

    1

    文章

    1269

    浏览量

    31723
  • 日志
    +关注

    关注

    0

    文章

    149

    浏览量

    11097

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    求助 LabVIEW 字符串比较

    请教大神 ,用一个字符串和多个字符串比较程序应该怎么做。 比如:A字符串和B字符串组(B组字符串个数不定可以是一个也可以是10个) 比较 A
    发表于 03-02 17:24

    打开工程后工程的字体没有显示,如字符串,数字等控件不能预览显示字体?

    打开工程后工程的字体没有显示,如字符串,数字等控件不能预览显示字体?
    发表于 02-25 17:39

    【RA-Eco-RA2E1-V1.0开发板试用】串口打印例程。

    本实验基于瑞萨 RA 系列单片机完成UART 串口通信与printf 重定向功能实现,通过配置串口引脚、初始化驱动、编写发送回调函数,实现了开发板与上位之间的数据收发,并可直接使用p
    的头像 发表于 02-24 16:33 449次阅读
    【RA-Eco-RA2E1-V1.0开发板试用】串口<b class='flag-5'>打印</b>例程。

    CH32V系列MCU单片机网络小票打印机方案应用

    在智能零售与物联网设备快速普及的今天,传统小票打印机在连接灵活性、多终端协同及响应速度上面临全新挑战。为此,我们推出基于CH32V系列MCU单片机的高性能网络小票打印机方案,以强大的核心处理能力与丰富的集成外设,为商用
    的头像 发表于 01-21 16:31 874次阅读
    CH32V系列MCU<b class='flag-5'>单片机</b>网络小票<b class='flag-5'>打印</b>机方案应用

    字符串控件与静态字符串控件预览字符显示乱码,如何修改显示正常?

    字符串控件与静态字符串控件预览字符显示乱码,如何修改显示正常?
    发表于 01-20 17:17

    字符串,数字控件如何控制背景颜色和前景字体颜色?

    字符串,数字控件如何控制背景颜色和前景字体颜色?
    发表于 01-20 15:12

    Linux下怎么让中文字符串按照拼音排序?

    求教 Linux 下怎么让中文字符串按照拼音排序?
    发表于 01-06 07:40

    字符串关联数字变量如何使用?我们的地址都是16位数据,可以使用16位数字变量显示字符串吗?

    字符串关联数字变量如何使用?我们的地址都是16位数据,可以使用16位数字变量显示字符串吗?
    发表于 12-15 08:24

    单片机使用printf打印编译出错的原因?

    单片机使用printf打印编译出错,有哪些情况?
    发表于 11-21 06:02

    求助,关于C代码的printf打印的疑问求解

    在使用E203 testbench执行附带的benchmark测试用例时候,得到如下打印信息: CPU验证小白一枚,有个问题不是很理解:黄色框框内的字符看起来应该是C代码的printf语句
    发表于 11-10 07:54

    labview如何生成一个带字符串返回的dll

    labview如何生成一个dll,如下图,要求一个输入,类型是字符串,返回类型也是字符串
    发表于 08-28 23:20

    在Python字符串逆序有几种方式,代码是什么

    对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作,毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了,今天总结了一下python对于字符串的逆序
    的头像 发表于 08-28 14:44 1277次阅读

    单片机怎么驱动电机?

    在各类自动化设备和智能装置,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,才能实现
    的头像 发表于 07-25 09:31 1301次阅读

    为啥51单片机能搞,峰岹的就会报错呢?

    如图图1是stc系列单片机的代码,发送字符串都可以,但是图二峰岹的代码发送字符串就不行,会报错
    发表于 07-09 13:39

    harmony-utils之StrUtil,字符串工具类

    harmony-utils之StrUtil,字符串工具类 harmony-utils 简介与说明 [harmony-utils] 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类
    的头像 发表于 07-03 11:32 781次阅读