串口打印彩色log

单片机开发中串口日志的打印极大方便了我的调试工作,随着日志数据的增加又带来新的问题:短时间吐出的大量数据实在是让人眼花缭乱。
如何在大量数据中一眼找到重点成为我今天的课题。如果在终端中能以不同颜色甚至不同字体展示数据无疑可以在极大程序上解决“海底捞针”的困境。
彩色日志在学习zerphy中就给我留下深刻印象,今日是第一次实现这个功能。
终端通过ANSI转义序列识别内部指令,查阅资料,将颜色及字体相关的序列摘抄如下:

转义序列码 对应的重置序列 描述
ESC[1;34;{...}m 设置单元格(?)的图形模式,用分号分隔 ;
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
34 44
品红 35 45
36 46
37 47
默认 39 49
重置 0 0

代码示例:

点击查看代码
void DBG_Inf(DbgLevel_eTypeDef _level, char *fmt,...)
{
    uint16_t len=0;
    va_list args;

    //_level小于调试打印输出级别时不打印数据
    if(_level < DBG_LOG_LEVEL)
        return;

    va_start(args, fmt);            //获取可变参数列表的第一个参数地址

    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"));
}

效果展示

ScreenShot_2025-10-30_230420_288

参考链接:https://www.cnblogs.com/chargedcreeper/p/-/ANSI

posted @ 2025-10-30 23:09  Jonathan_Ray  阅读(5)  评论(0)    收藏  举报