色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    592

    瀏覽量

    34209
  • 串口
    +關注

    關注

    14

    文章

    1570

    瀏覽量

    77667
  • 函數
    +關注

    關注

    3

    文章

    4353

    瀏覽量

    63290
  • 命令
    +關注

    關注

    5

    文章

    705

    瀏覽量

    22230
  • Printf
    +關注

    關注

    0

    文章

    83

    瀏覽量

    13813
收藏 人收藏

    評論

    相關推薦

    怎樣用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 ?6571次閱讀

    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 ?13次下載
    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 ?3016次閱讀
    【RT-Thread學習筆記】多彩的<b class='flag-5'>printf</b>日志<b class='flag-5'>輸出</b>

    printf輸出重定向的方法

    在 PC 上運行 C 語言時,prinf 輸出的內容會打印在電腦顯示器上,這是因為 prinf 默認的輸出設備就是顯示器。而當我們在單片機上,需要通過 printf
    的頭像 發表于 05-14 16:22 ?5540次閱讀
    <b class='flag-5'>printf</b><b class='flag-5'>輸出</b>重定向的方法
    主站蜘蛛池模板: 国产精品亚洲二线在线播放 | 国精产品一区二区三区 | 亚洲午夜久久影院 | 国产人妻精品无码AV在线五十路 | 久久久影院亚洲精品 | 亚洲国产精品无码2019 | 日本无码人妻丰满熟妇5G影院 | 大香网伊人久久综合网2020 | 久久这里只有精品视频9 | 久久99精品AV99果冻 | 欧美人成人亚洲专区中文字幕 | 涩里番app黄版网站 色综合伊人色综合网站中国 | 韩国羞羞秘密教学子开车漫书 | 国产WW高清大片免费看 | 992交通广播 | 欧美午夜精品久久久久久浪潮 | 第四色播日韩AV第一页 | 快播理论片 | 国产精品久久久亚洲偷窥女厕 | 妞干网手机免费视频 | 免费果冻传媒在线完整观看 | 高清日本片免费观看 | 99热国产这里只有精品免费 | 国产网址在线观看 | 嫩草www视频在线观看高清 | 亚洲 欧美 中文 日韩 视频 | 香蕉鱼视频观看在线视频下载 | 国产精品永久在线 | 国产自啪偷啪视频在线 | 99久久就热视频精品草 | 加勒比一本之道高清视频在线观看 | 肉蒲团从国内封禁到日本成经典 | 4399亚洲AV无码V无码网站 | 国产久久亚洲美女久久 | 国产午夜福利伦理300 | 精品国产乱码久久久久乱码 | 国产亚洲人成在线视频 | 午夜一个人在线观看完整版 | 亚洲中字幕永久在线观看 | 最新亚洲一区二区三区四区 | 久久久免费热线精品频 |