衡阳派盒市场营销有限公司

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;i256;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


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6043

    文章

    44621

    瀏覽量

    638628
  • 終端
    +關注

    關注

    1

    文章

    1156

    瀏覽量

    30008
  • 日志
    +關注

    關注

    0

    文章

    139

    瀏覽量

    10679

原文標題:單片機打印日志還能這么玩?一招秀翻~

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    字符串在數據庫的存儲方式

    數據庫是現代信息技術存儲和管理數據的核心組件。字符串作為最常見的數據類型之一,在數據庫的存儲方式對其性能和可擴展性有著重要影響。 數據類型 固定長度字符串 :如CHAR類型,它為每
    的頭像 發表于 01-07 15:41 ?194次閱讀

    字符串在編程的應用實例

    常以字符串的形式出現。例如,在命令行程序,用戶輸入的命令和參數都是字符串。 輸出信息 :程序也經常需要向用戶顯示信息,這些信息同樣可以以字符串的形式呈現。例如,
    的頭像 發表于 01-07 15:33 ?152次閱讀

    字符串字符數組的區別

    在編程語言中,字符串字符數組是兩種基本的數據結構,它們都用于存儲和處理文本數據。盡管它們在功能上有一定的重疊,但在內部表示、操作方式和使用場景上存在顯著差異。 1. 內部表示 字符串 字符串
    的頭像 發表于 01-07 15:29 ?293次閱讀

    字符串反轉的實現方式

    在編程字符串反轉是一個基礎而重要的操作,它涉及到將一個字符串字符順序顛倒過來。這個操作在多種編程語言中都有不同的
    的頭像 發表于 01-07 15:27 ?206次閱讀

    字符串處理方法 字符串轉數字的實現

    在編程,將字符串轉換為數字是一個常見的需求。不同的編程語言有不同的方法來實現這一功能。以下是一些常見編程語言中的字符串轉數字的實現方法:
    的頭像 發表于 01-07 15:26 ?189次閱讀

    base64字符串轉換為二進制文件

    Base64是一種編碼方法,用于將二進制數據轉換為ASCII字符串。這種編碼通常用于在不支持二進制數據的系統傳輸數據,例如電子郵件或網頁。將Base64字符串轉換為二進制文件的過程相對簡單,但需要
    的頭像 發表于 11-10 10:55 ?1653次閱讀

    labview字符串數組轉化為數值數組

    在LabVIEW,將字符串數組轉換為數值數組是一項常見的任務,尤其是在處理數據采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數據類型 在開始之前,了解LabVIEW的數據類型是非
    的頭像 發表于 09-04 17:47 ?2847次閱讀

    labview字符串如何轉換為16進制字符串

    在LabVIEW,將字符串轉換為16進制字符串是一個常見的需求,尤其是在處理數據通信和硬件接口時。LabVIEW提供了多種方法來實現這一轉換,包括使用內置函數、編寫VI(Virtua
    的頭像 發表于 09-04 15:54 ?3036次閱讀

    labview如何實現字符串換行

    1. 字符串換行的基本概念 在LabVIEW字符串換行通常指的是在字符串插入換行符,使得字符串
    的頭像 發表于 09-04 15:47 ?2042次閱讀

    labview如何實現字符串選擇輸出

    在LabVIEW實現字符串選擇輸出是一項常見的任務,它涉及到字符串處理、條件判斷和用戶界面設計等多個方面。由于LabVIEW是一種圖形化編程語言,其編程方式與傳統的文本編程語言有所不
    的頭像 發表于 09-04 15:44 ?1086次閱讀

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

    在LabVIEW,常用的字符串函數廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是一些常用的字符串函數及其簡要說明:
    的頭像 發表于 09-04 15:43 ?991次閱讀

    labview字符串的四種表示各有什么特點

    。在LabVIEW字符串是一種基本的數據類型,用于表示文本信息。字符串在LabVIEW中有多種表示方式,每種方式都有其特定的應用場景和特點。以下是對LabVIEW四種
    的頭像 發表于 09-04 15:40 ?710次閱讀

    rtt studio終端無法打印字符串是怎么回事?

    求助:rtt studio新創建的項目使用自帶終端可以打印字符串,但是將字符串輸出語句注釋掉再改回來終端就無法打印了,并且msh也未顯示也無法使用輸入,使用其他的串口調試助手看到了rtt的界面以及
    發表于 07-05 07:29

    鴻蒙TypeScript學習第10天:【String(字符串)】

    String 對象用于處理文本(字符串)。
    的頭像 發表于 04-08 14:32 ?889次閱讀
    鴻蒙TypeScript學習第10天:【String(<b class='flag-5'>字符串</b>)】

    C語言字符串編譯函數介紹

    在C語言中,字符串實際上是使用null字符O'終止的一維字符數組。因此,一個以null結尾的字符串,包含了組成字符串
    的頭像 發表于 03-07 16:18 ?556次閱讀
    C語言<b class='flag-5'>字符串</b>編譯函數介紹
    百家乐官网筹码托盘| 百家乐官网投注开户| 百家乐白菜价| 百家乐官网线上| 澳门赌博技巧| 大发888娱乐城注册送筹码| A8百家乐官网娱乐场| 百家乐官网风云人物| 全讯网报码| 做生意店铺缺西北角| 百家乐官网永利娱乐城| 老虎机破解器| 百家乐保单机作弊| 百家乐官网园选| 百家乐官网注册开户送现金 | 武汉百家乐庄闲和| 百家乐官网二代理解| 百家乐官网投注怎么样| 广平县| 德江县| 足球下注| 香港六合彩现场直播| 大发888娱乐场17| 威尼斯人娱乐场xpjgw5xsjgw| 迪士尼百家乐的玩法技巧和规则| 百家乐网络投注| 索雷尔百家乐官网的玩法技巧和规则 | 大发888官方sscptdf88yb| 合乐8百家乐娱乐城| 百家乐平注常赢法| 百家乐路单破解软件| 新濠百家乐官网的玩法技巧和规则| 大发888破解老虎机| 大发888信誉平台| 大发888 yule| 12bet| 大发888娱乐城手机版| 大发888娱乐客户端| 大发888游戏官方| 威尼斯人娱乐场官网48008| 大发888站群|