串口打印彩色log
單片機(jī)開發(fā)中串口日志的打印極大方便了我的調(diào)試工作,隨著日志數(shù)據(jù)的增加又帶來(lái)新的問(wèn)題:短時(shí)間吐出的大量數(shù)據(jù)實(shí)在是讓人眼花繚亂。
如何在大量數(shù)據(jù)中一眼找到重點(diǎn)成為我今天的課題。如果在終端中能以不同顏色甚至不同字體展示數(shù)據(jù)無(wú)疑可以在極大程序上解決“海底撈針”的困境。
彩色日志在學(xué)習(xí)zerphy中就給我留下深刻印象,今日是第一次實(shí)現(xiàn)這個(gè)功能。
終端通過(guò)ANSI轉(zhuǎn)義序列識(shí)別內(nèi)部指令,查閱資料,將顏色及字體相關(guān)的序列摘抄如下:
| 轉(zhuǎn)義序列碼 | 對(duì)應(yīng)的重置序列 | 描述 |
|---|---|---|
| ESC[1;34;{...}m | 設(shè)置單元格(?)的圖形模式,用分號(hào)分隔 ; | |
| ESC[0m | 重置(消除)所有顏色和圖形 | |
| ESC[1m | ESC[22m | 粗體 |
| ESC[2m | ESC[22m | 虛化(暗淡) |
| ESC[3m | ESC[23m | 斜體 |
| ESC[4m | ESC[24m | 下劃線 |
| ESC[5m | ESC[25m | 閃爍 |
| ESC[7m | ESC[27m | 反向 |
| ESC[8m | ESC[28m | 隱形 |
| ESC[9m | ESC[29m | 刪除線 |
| 顏色名 | 前景色(字)碼 | 背景色碼 |
|---|---|---|
| 黑 | 30 | 40 |
| 紅 | 31 | 41 |
| 綠 | 32 | 42 |
| 黃 | 33 | 43 |
| 藍(lán) | 34 | 44 |
| 品紅 | 35 | 45 |
| 青 | 36 | 46 |
| 白 | 37 | 47 |
| 默認(rèn) | 39 | 49 |
| 重置 | 0 | 0 |
代碼示例:
點(diǎn)擊查看代碼
void DBG_Inf(DbgLevel_eTypeDef _level, char *fmt,...)
{
uint16_t len=0;
va_list args;
//_level小于調(diào)試打印輸出級(jí)別時(shí)不打印數(shù)據(jù)
if(_level < DBG_LOG_LEVEL)
return;
va_start(args, fmt); //獲取可變參數(shù)列表的第一個(gè)參數(shù)地址
if(DBG_LEVEL_INFO == _level)
{
memcpy(dbg_buf, (const void*)"INFO:", sizeof("INFO:"));
len = sizeof("INFO:");
}
else if(DBG_LEVEL_WARN == _level)
{
memcpy(dbg_buf, (const void*)"\x1b[33mWARN:", sizeof("\x1b[33mWARN:"));
len = sizeof("\x1b[33mWARN:");
}
else if(DBG_LEVEL_ERR == _level)
{
memcpy(dbg_buf, (const void*)"\x1b[31mERR:", sizeof("\x1b[31mERR:"));
len = sizeof("\x1b[31mERR:");
}
len += vsnprintf(dbg_buf+len, DBG_BUF_LENGTH, fmt, args);
va_end(args);
UART_SendDatas(DEBUG_UARTx, (uint8_t *)dbg_buf, len);
UART_SendDatas(DEBUG_UARTx, "\x1b[0m", sizeof("\x1b[0m"));
}
效果展示


浙公網(wǎng)安備 33010602011771號(hào)