第06章 公共层
约 536 字大约 2 分钟
2026-02-03
6.1 日志输出模块
虽然ESP-IDF已经有了比较完善的日志输出系统, 但是仍然无法自动输出文件名和行号,我们在他们日志输出系统的基础上进一步封装, 可以自动输出文件名和行号
① 创建目录和文件
在 main 目录下,创建目录 Com, 在 Com 目录下创建文件: Com_Debug.h和Com_Debug.c

在 main 目录下的 \main\CMakeLists.txt 添加如下代码

② 代码
Com_Debug.h
#ifndef __COM_DEBUG_H
#define __COM_DEBUG_H
#include "esp_log.h"
#include "string.h"
#include "esp_task.h"
#define DEBUG 1
extern char tag[100];
#if(DEBUG == 1)
#define MY_LOGE(format, ...) \
do { \
sprintf(tag, "[%20s:%4d]", __FILENAME__, __LINE__); \
ESP_LOGE(tag, format, ##__VA_ARGS__); \
} while(0)
#define MY_LOGW(format, ...) \
do { \
sprintf(tag, "[%20s:%4d]", __FILENAME__, __LINE__); \
ESP_LOGW(tag, format, ##__VA_ARGS__); \
} while(0)
#define MY_LOGI(format, ...) \
do { \
sprintf(tag, "[%20s:%4d]", __FILENAME__, __LINE__); \
ESP_LOGI(tag, format, ##__VA_ARGS__); \
} while(0)
#define MY_LOGD(format, ...) \
do { \
sprintf(tag, "[%20s:%4d]", __FILENAME__, __LINE__); \
ESP_LOGD(tag, format, ##__VA_ARGS__); \
} while(0)
#define MY_LOGV(format, ...) \
do { \
sprintf(tag, "[%20s:%4d]", __FILENAME__, __LINE__); \
ESP_LOGV(tag, format, ##__VA_ARGS__); \
} while(0)
#else
#define MY_LOGE(format, ...)
#define MY_LOGW(format, ...)
#define MY_LOGI(format, ...)
#define MY_LOGD(format, ...)
#define MY_LOGV(format, ...)
#endif
#endifCom_Debug.c
#include "Com_Debug.h"
char tag[100];③ 相关函数
| 函数/宏 | 级别 | 主要用途与描述 |
|---|---|---|
| ESP_LOGE | 错误 (Error) | 记录错误信息,用于严重的、通常导致模块无法自行恢复的问题。 |
| ESP_LOGW | 警告 (Warning) | 记录警告信息,表示可能有问题但不影响程序继续运行的情况。 |
| ESP_LOGI | 信息 (Info) | 记录常规信息,描述程序正常的执行流程和状态,是默认可见的常用日志。 |
| ESP_LOGD | 调试 (Debug) | 记录调试信息,提供详细的内部数据(如变量值、指针),通常在开发和调试阶段使用。 |
| ESP_LOGV | 详细 (Verbose) | 记录最详细的运行信息,输出频率高、内容最详尽,用于深度排查复杂问题。 |
6.2 公共配置模块
对把一些公共配置或者常用的类型,定义在Com_Config.h中。
① 创建文件
在 Com 目录下创建文件 Com_Config.h

② 代码
Com_Config.h
#ifndef __COM_CONFIG_H
#define __COM_CONFIG_H
typedef enum
{
Com_OK,
Com_ERROR,
Com_TIMEOUT,
Com_OTHER,
} Com_Status;
#endif