在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用printf函數通過串口能否輸出彩色的調試信息

CHANBAEK ? 來源:猿來如此 I See ? 作者:YJer ? 2023-05-14 16:16 ? 次閱讀

前言

正常情況下,使用 printf 向串口打印調試信息,在串口調試工具界面只能看到一種顏色的字符,且使用不同的串口調試工具,字符默認的顏色都不一樣。

如果你在 VSCode 上使用過 ESP-IDF 開發 ESP32 應用程序,你會發現其終端上輸出的調試信息是五顏六色的,十分花哨。 而且不同類型的調試信息使用不同的顏色區分,能夠快速地定位到程序中的問題,非常便捷實用。

那么我們使用 printf 函數通過串口能否輸出彩色的調試信息呢? 答案是肯定的,只是需要一丟丟小技巧罷了。

ANSI 轉義序列

在介紹如何打印彩色調試信息之前,我們先來了解一些背景知識 —— ANSI 轉義序列。

我們將信息打印到終端上顯示時,可以控制信息顯示成粗體、斜體、下劃線等形式,也可以控制字符顯示不同的顏色。

例如執行如下代碼,會在終端上顯示紅色 ---testing---:

printf("\\033[31m---testing---\\n");

為什么有些字符會被當做信息顯示,有些字符會被當做命令處理? 其實這一切都歸功于轉義字符。

C語言中,用反斜杠 "" 作為轉義字符,正常情況下,"" 和 "n" 都是普通的字符,但是將這兩個字符組合起來變成 "\\n" 的字符序列后,就表示換行符了。

在終端中也有類似的用法,只不過終端中的轉義字符不是反斜杠 "" ,而是 "ESC"。 終端使用 "ESC" 作為轉義字符,而 "ESC" 在 ASCII 表中的序號是 27,也就是 0x1b,因此終端中與 0x1b 組合起來的字符序列就會被轉義成命令,不同的字符組合表示不同的終端命令,這些轉義規則被規范化以后,就叫做 ANSI 轉義序列(ANSI Escape Sequences), 主要用來控制終端上光標位置、顏色及其他選項。

ANSI 轉義序列起始標志

ANSI 轉義序列起始標志由兩個字節組成,第一個字節是終端轉義字符 "ESC" 也就是 0x1b,第二個字節的取值范圍是0x40–0x5F(即 ASCII:@ A – Z [ \\ ] ^ _),也就是說 ANSI 轉義序列的起始標志共有如下幾種:

  • x1b@(ESC@)
  • x1bA(掃描)
  • x1b-(電調-)
  • x1bZ(ESCZ)
  • x1b[(ESC[)
  • x1b\\(ESC\\)
  • x1b](ESC])
  • x1b^(ESC^)
  • x1b_(ESC_)

上述那么多種起始標志,常見的起始標志就是 " x1b[ " ,其他的起始標志現在都很少用到了。

控制符起始標志 CSI

當 0x1b 與 "[" 組合時,就叫做控制符起始標志(Control Sequence Introducer),簡稱為 CSI ,其基本格式如下:

x1b[<code><tail>

code: 轉義序列的具體內容,多個內容之間使用分號 ";" 隔開

tail : 轉義序列結束標志,不同 tail 表示不同功能的序列

以 CSI 開頭的轉義序列有很多,不同的序列表示不同的終端指令,大致可以分為如下幾類:

  • 字符渲染指令(SGR)
  • 光標移動指令
  • 清屏指令
  • 終端控制指令

字符渲染指令

字符渲指令(Select Graphic Rendition),簡稱為 SGR 。主要用于設置字符顯示效果,其基本格式如下:

CSI編號

CSI:控制符起始標志 " 0x1b[ "

n :取值范圍 0 ~ 107

m :轉義序列結束標志,字母 m 作為結尾,表明是字符渲染序列

示例:

x1b[3m

n 的取值范圍是 0 ~ 107,主要分為如下兩類功能:

  • 字符樣式控制
  • 字符顏色控制

n 的取值及說明:

n 功能 示例
0 重置/正常 x1b[0m 或 x1b[m
1 粗體或增加強度 x1b[1m
2 弱化(降低強度) x1b[2m
3 斜體 x1b[3m
4 下劃線 x1b[4m
5 緩慢閃爍 ......
6 快速閃爍 ......
7 反顯 ......
8 隱藏 ......
9 劃除 ......
10 主要(默認)字體 ......
11–19 替代字體 ......
20 尖角體 ......
21 關閉粗體或雙下劃線 ......
22 正常顏色或強度 ......
23 非斜體、非尖角體 ......
24 關閉下劃線 ......
25 關閉閃爍 ......
27 關閉反顯 ......
28 關閉隱藏 ......
29 關閉劃除 ......
30–37 設置前景色 ......
38 設置前景色 ......
39 默認前景色 ......
40–47 設置背景色 ......
48 設置背景色 ......
49 默認背景色 ......
51 Framed ......
52 Encircled ......
53 上劃線 ......
54 Not framed or encircled ......
55 關閉上劃線 ......
60 表意文字下劃線或右邊線 ......
61 表意文字雙下劃線或雙右邊線 ......
62 表意文字上劃線或左邊線 ......
63 表意文字雙上劃線或雙左邊線 ......
64 表意文字著重標志 ......
65 表意文字屬性關閉 ......
90–97 設置明亮的前景色 ......
100–107 設置明亮的背景色 ......

有了上述這些背景知識,就足夠搞懂串口輸出彩色調試信息的原理了,關于 ANSI 轉義序列的更多內容,感興趣的小伙伴可以自行查閱。

串口輸出彩色調試信息

在 《單片機 printf 重定向串口輸出調試信息》這篇文章中介紹了如何使用 printf 通過串口輸出調試信息,那么現在就在此基礎上,再說說如何將輸出的調試信息變成彩色的。

通過串口輸出彩色調試信息有兩個必要條件:

  • printf 參數列表中添加字符顏色控制相關的 ANSI轉義序列
  • 接收串口數據的串口調試工具支持 ANSI 轉義序列解析

回顧一下上面講到的字符渲指令(SGR),其基本格式如下:

CSI n m

CSI:控制符起始標志 " 0x1b[ "

n :取值范圍 0 ~ 107

m :轉義序列結束標志,字母 m 作為結尾,表明是字符渲染序列

當我們想要輸出不同顏色的字符時,將 n 替換成對應的數字即可,常見的顏色如下:

n 功能 示例
30 黑色 x1b[30m
31 紅色 x1b[31m
32 綠色 x1b[32m
33 黃色 x1b[33m
34 藍色 x1b[34m
35 品紅 x1b[35m
36 青色 x1b[36m

使用 printf 打印 "Hello World" 代碼如下:

printf("Hello World\\n");

打印不同的 "Hello World" 代碼如下:

printf("\\x1b[31m" "Hello World\\n" "\\x1b[0m"); 
printf("\\x1b[32m" "Hello World\\n" "\\x1b[0m"); 
printf("\\x1b[33m" "Hello World\\n" "\\x1b[0m"); 
printf("\\x1b[34m" "Hello World\\n" "\\x1b[0m"); 
printf("\\x1b[35m" "Hello World\\n" "\\x1b[0m");
printf("\\x1b[36m" "Hello World\\n" "\\x1b[0m");

注意事項

如果使用的串口調試工具不支持 ANSI 轉義序列解析,那么接收到的串口數據會有部分亂碼,而且只會使用工具默認的顏色顯示信息:

支持 ANSI 轉義序列解析的串口調試工具才能正常顯示彩色字符,推薦使用 MobaXterm 。

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

    關注

    7

    文章

    608

    瀏覽量

    34546
  • 串口
    +關注

    關注

    14

    文章

    1586

    瀏覽量

    79052
  • 函數
    +關注

    關注

    3

    文章

    4372

    瀏覽量

    64309
  • 命令
    +關注

    關注

    5

    文章

    730

    瀏覽量

    22712
  • Printf
    +關注

    關注

    0

    文章

    84

    瀏覽量

    14131
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    怎樣用printf()函數實現通過串口打印信息

    在使用STM32調試時,經常使用串口發送信息,為了方便調試串口發送信息,用
    發表于 08-05 07:07

    不同的串口使用printf函數輸出對應的信息

    這個實驗向我們演示,不同的串口使用printf函數輸出對應的信息。默認printf()
    發表于 08-10 08:01

    stm32在調試時可以使用printf通過串口輸出當前信息

    stm32在調試時可以使用printf通過串口輸出當前信息嗎?
    發表于 12-02 07:05

    STM8S串口打印調試信息(不使用printf)

    STM8S串口打印調試信息(不使用printf),感興趣可以看看。
    發表于 07-25 18:52 ?51次下載

    基于STM32的printf串口數據輸出

    該方法適用于 STM32 ,實現了使用printf等標準C流函數輸出數據的辦法,極大的減少了輸出 串口數據 時所需要做的數據處理。 實現原理
    發表于 06-21 07:51 ?2w次閱讀
    基于STM32的<b class='flag-5'>printf</b><b class='flag-5'>串口</b>數據<b class='flag-5'>輸出</b>

    基于STM32中調試串口之間的信息傳輸

    問題:在使用STM32調試時,經常使用串口發送信息,為了方便調試串口發送信息,用
    發表于 06-21 07:53 ?6652次閱讀

    Keil C51重定向printf串口的程序免費下載

    進行C/C++開發的時候我們都會需要打印調試信息,打印調試信息時我們習慣使用printf函數,但
    發表于 07-19 17:38 ?14次下載
    Keil C51重定向<b class='flag-5'>printf</b>到<b class='flag-5'>串口</b>的程序免費下載

    51單片機串口通信調試printf函數重定向輸出打印

    51單片機串口通信以及printf調試串行通信1.串口初始化串口工作方式波特率設置通過軟件直接生
    發表于 11-20 16:36 ?16次下載
    51單片機<b class='flag-5'>串口</b>通信<b class='flag-5'>調試</b><b class='flag-5'>printf</b><b class='flag-5'>函數</b>重定向<b class='flag-5'>輸出</b>打印

    printf通過串口輸出在MCU上的實現

    對mcu的開發調試過程中,通過串口打印運行過程中的一些信息,有時候比調試器好用。以及在產品使用中,通過
    發表于 12-07 15:21 ?4次下載
    <b class='flag-5'>printf</b><b class='flag-5'>通過</b><b class='flag-5'>串口</b><b class='flag-5'>輸出</b>在MCU上的實現

    STM32使用串口重定向系統printf函數輸出時出現一初始化或使用printf函數系統卡死的原因及解決辦法

    STM32使用串口重定向系統printf函數輸出時出現一初始化或使用printf函數系統卡死的原
    發表于 12-09 10:06 ?16次下載
    STM32使用<b class='flag-5'>串口</b>重定向系統<b class='flag-5'>printf</b><b class='flag-5'>函數</b><b class='flag-5'>輸出</b>時出現一初始化或使用<b class='flag-5'>printf</b><b class='flag-5'>函數</b>系統卡死的原因及解決辦法

    STM32單片機基礎09——重定向printf函數串口輸出的多種方法

    本文詳細的介紹了如何重定向printf輸出串口輸出的多種方法,包括調用MDK微庫(MicroLib)的方法,調用標準庫的方法,以及適用于 GNUC 系列編譯器的方法。1.
    發表于 12-27 19:22 ?10次下載
    STM32單片機基礎09——重定向<b class='flag-5'>printf</b><b class='flag-5'>函數</b>到<b class='flag-5'>串口</b><b class='flag-5'>輸出</b>的多種方法

    stm32printf函數串口輸出代碼

    stm32f103串口一與串口printf函數輸出、本人是萌新,因項目需要特意配置了該段代碼,不喜勿噴,純屬個人筆記。對于
    發表于 12-28 19:10 ?13次下載
    stm32<b class='flag-5'>printf</b><b class='flag-5'>函數</b>的<b class='flag-5'>串口</b><b class='flag-5'>輸出</b>代碼

    通過串口利用printf函數輸出數據

    一。printf函數格式printf函數具有強大的輸出功能%表示格式化字符串輸出目前
    發表于 12-28 19:11 ?11次下載
    <b class='flag-5'>通過</b><b class='flag-5'>串口</b>利用<b class='flag-5'>printf</b><b class='flag-5'>函數</b><b class='flag-5'>輸出</b>數據

    【RT-Thread學習筆記】多彩的printf日志輸出

    如何使用printf輸出彩色的日志信息
    的頭像 發表于 07-30 14:05 ?3326次閱讀
    【RT-Thread學習筆記】多彩的<b class='flag-5'>printf</b>日志<b class='flag-5'>輸出</b>

    printf輸出重定向的方法

    在 PC 上運行 C 語言時,prinf 輸出的內容會打印在電腦顯示器上,這是因為 prinf 默認的輸出設備就是顯示器。而當我們在單片機上,需要通過 printf
    的頭像 發表于 05-14 16:22 ?5927次閱讀
    <b class='flag-5'>printf</b><b class='flag-5'>輸出</b>重定向的方法
    主站蜘蛛池模板: 黄色三级在线观看 | 毛片一级黄色 | 国产精品性 | 黄色h视频| 性欧美人与zooz | 黄色午夜视频 | 三级视频网站在线观看 | 精品伊人久久香线蕉 | 黄色aaa大片| 国产精品偷伦费观看 | 黄色网址中文字幕 | 成人国产精品2021 | 天天亚洲 | 欧美一卡二三卡四卡不卡 | 亚洲97在线| 国产精品9999久久久久仙踪林 | 日韩ab| 手机看片日韩在线 | 国产在线h| 色香蕉在线 | 67pao强力打造高清免费 | 色视频在线播放 | 一级片免费在线观看视频 | 99视频在线永久免费观看 | 亚洲一区视频 | 天天色爱| 一级免费看片 | 爱爱的免费视频 | 黄色免费三级 | 亚洲福利视频一区二区 | 特黄一级毛片 | avbobo在线 | 久久观看午夜精品 | 白嫩美女一级高清毛片免费看 | 速度与激情一 | 立即播放免费毛片一级 | 黄色大片日本 | 亚洲a区视频 | 最近国语剧情视频在线观看 | 国产三级精品三级 | 日本国产黄色片 |