通过ESP32 logging库来启发我们的思维吧~~
零. 声明
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对ESP-IDF开发有一个总体的认识,比我们后续学习打下基础!
第二篇:ESP32-IDF外设驱动介绍,主要会根据esp-idf现有的driver,提供各个外设的驱动,比如LED,OLED,SPI LCD,TOUCH,红外,Codec ic等等,在这一篇中,我们不仅仅来做外设驱动,还会对常用的外设总线做一个介绍,让大家知其然又知其所以然!
第三篇:目前比较火热的GUI LVGL介绍,主要会设计LVGL7.1,LVGL8的移植介绍,并且也会介绍各个组件,知道原理后,最后,我们会推出一款组态软件来构建我们的GUI,来提升我们的效率!
第四篇:ESP32-蓝牙,熟悉我的,应该都知道,我即使从事蓝牙协议栈的开发的,所以这个是我们独有的优势,在这一篇章,我们会提供不仅仅是蓝牙应用方法的知识,也会应用结合蓝牙底层协议栈的理论,让你彻底从上到下打通蓝牙任督二脉!
第五篇:Wi-Fi介绍,熟悉我的,应该也知道,我们也做过一款sdio wifi的驱动教程板子,所以在wifi这方面我们也是有独有的优势,在这一篇章,我们同样不仅仅提供Wi-Fi应用方面的知识,也会结合底层理论,让你对Wi-Fi有一个清晰的认知!
另外,我们的教程包括但是不局限于以上篇章,为了给你一个更好的导航,以下信息尤其重要,请详细查看!!
------------------------------------------------------------------------------------------------------------------------------------------
购买开发板(点击我)
文档目录(点击我)
Github代码仓库(点击我)
蓝牙交流扣扣群:539357317
微信公众号↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
------------------------------------------------------------------------------------------------------------------------------------------
一.概述
日志库有两种管理日志详细程度的方法:
编译阶段,通过菜单设置;
运行阶段,使用esp_log_level_set()函数设置。
日志等级有:错误,警告,信息,调试和详细(详细度从最低到最高)。
在编译阶段,使用CONFIG_LOG_DEFAULT_LEVEL选项过滤。所有等级状态高于CONFIG_LOG_DEFAULT_LEVELD的日志将会被处理器移除。
在运行阶段,所有低于CONFIG_LOG_DEFAULT_LEVEL的日志被默认使能。esp_log_level_set()函数可以用来减少每个模块的日志等级。模块通过标签识别,这些标签是可读的零结尾的ASCII字符串。
注意:esp_log_level_set()函数不能提高到超过CONFIG_LOG_DEFAULT_LEVEL设置的等级。在编译阶段,为了给特殊文件提高日志等级,可以使用LOG_LOCAL_LEVEL宏(详见下)。
二.如何使用库
在每个C文件里使用日志功能,需要这样定义TAG变量:
static const char* TAG = "MyModule";
然后使用一条日志宏来产生输出,比如:
ESP_LOGW(TAG, "Baud rate error %.1f%%. Requestd: %d baud, actual: %d", error * 100, baud_req, baud_real);
以下是一些不同复杂度的日志宏:
. ESP_LOGE - error(lowest)
. ESP_LOGW - warning
. ESP_LOGI -info
. ESP_LOGD -debug
. ESP_LOGV -verbose(highest)
另外有一个_EARLY变量对应以上每一个宏(比如ESP_EARLY_LOGE)。这些变量可以在启动代码中运行,在堆栈分配和系统调用被初始化前。当编译引导程序时,普通的ESP_LOGx宏不像ESP_EARLY_LOGx那么有效。所以ESP_EARLY_LOGx明确的唯一用处是在启动代码里,比如堆栈分配初始化代码。
为了覆盖一个文件或部件作用范围的默认详细度,定义LOG_LOCAL_LEVEL宏。在文件作用范围,在 inclueing esp_log.h 前定义它,比如:
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"
在部件范围,在部件的makefile里定义:
CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG
在运行阶段,为了配置每个模块的日志输出,增加条用 esp_log_level_set() 函数:
esp_log_level_set("*", ESP_LOG_ERROR); // 设置所有的部件日志详细度为ERROR
esp_log_level_set("wifi", ESP_LOG_WARN); // 使能来自WiFi栈的警告日志
esp_log_level_set("dhcpc", ESP_LOG_INFO); // 使能来自DHCP客户端的信息日志
API的比较简单,具体可以详细参照下以下链接:Logging library - ESP32 - — ESP-IDF Programming Guide latest documentation
我们比较常用的就是以下几个吧
ESP_LOGE(tag, format, ...)
ESP_LOGW(tag, format, ...)
ESP_LOGI(tag, format, ...)
ESP_LOGD(tag, format, ...)
ESP_LOGV(tag, format, ...)
ESP_LOG_BUFFER_HEX(tag, buffer, buff_len)
三.使用logging库
1.menuconfig配置
Default log verbosity: 编译的log等级,决定哪些log能输出
Use ANSI terminal colors in log output: log等级是否有颜色输出。
NOTED:当然也要串口工具也要支持此功能才行,否则在颜色tag部分会输出乱码
Log Timestamps:日志时间戳
2.代码
我们在上面已经说明了怎么使用,我们直接来贴代码,然后看效果
#include "esp_log.h"static const char* TAG = "Wireless Link";void esp32_logging_lib_show()
{ESP_LOGE(TAG, "I am error log");ESP_LOGW(TAG, "I am warning log");ESP_LOGI(TAG, "I am info log");ESP_LOGD(TAG, "I am debug log");ESP_LOGV(TAG, "I am verbose log");
}void app_main(void)
{esp32_logging_lib_show();
}
效果:
由于我们menuconfig设置的是info,所以debug跟verbose没有显示
四.自己写一个log系统
我们看到上面这么炫酷,又是可以增加log等级,又是可以根据log等级显示不同的颜色的,那么他们是怎么实现的呢?我们要做到知其然又知其所以然,他的logging系统代码很简单,你们可以自己追下,我们来写一个简单的logging系统来看下效果吧,目的是起到抛砖引玉的作用:
wl_log.h的代码如下:
#include <stdio.h>/* Define trace levels */
#define WL_TRACE_LEVEL_NONE 0 /* No trace messages to be generated */
#define WL_TRACE_LEVEL_ERROR 1 /* Error condition trace messages */
#define WL_TRACE_LEVEL_WARNING 2 /* Warning condition trace messages */
#define WL_TRACE_LEVEL_INFO 3 /* Debug messages for info */
#define WL_TRACE_LEVEL_DEBUG 4 /* Full debug messages */
#define WL_TRACE_LEVEL_VERBOSE 5 /* Verbose debug messages */#define MAX_TRACE_LEVEL 6#define DEFAULT_LOG_LEVEL WL_TRACE_LEVEL_INFO#define LOG_COLOR_YELLOW "\033[40;33m"
#define LOG_COLOR_RED "\033[40;31m"
#define LOG_COLOR_BLUE "\033[40;36m"
#define LOG_COLOR_PURPLE "\033[40;35m"
#define LOG_COLOR_RESET "\033[0m"#define LOGCOMMON(tag, fmt, ...) printf(LOG_COLOR_BLUE"[ %s ] "LOG_COLOR_RESET fmt "\n", tag, ##__VA_ARGS__);
#define LOGWARN(tag, fmt, ...) printf(LOG_COLOR_BLUE"[ %s ] "LOG_COLOR_RESET LOG_COLOR_YELLOW fmt LOG_COLOR_RESET"\n", tag, ##__VA_ARGS__);
#define LOGERR(tag, fmt, ...) printf(LOG_COLOR_BLUE"[ %s ] "LOG_COLOR_RESET LOG_COLOR_RED fmt LOG_COLOR_RESET"\n", tag, ##__VA_ARGS__);#define WL_LOGE(tag,fmt,...) do{ if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_ERROR){LOGERR(tag,fmt,##__VA_ARGS__);} }while(0)
#define WL_LOGW(tag,fmt,...) do{ if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_WARNING){LOGWARN(tag, fmt,##__VA_ARGS__);} }while(0)
#define WL_LOGI(tag,fmt,...) do{ if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_INFO){LOGCOMMON(tag, fmt,##__VA_ARGS__);} }while(0)
#define WL_LOGD(tag,fmt,...) do{ if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_DEBUG){LOGCOMMON(tag, fmt,##__VA_ARGS__);} }while(0)
#define WL_LOGV(tag,fmt,...) do{ if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_VERBOSE){LOGCOMMON(tag, fmt,##__VA_ARGS__);} }while(0)
main.c的效果如下:
#include "esp_log.h"
#include "wl_log.h"static const char* TAG = "Wireless Link";void esp32_logging_lib_show()
{ESP_LOGE(TAG, "I am esp32 error log");ESP_LOGW(TAG, "I am esp32 warning log");ESP_LOGI(TAG, "I am esp32 info log");ESP_LOGD(TAG, "I am esp32 debug log");ESP_LOGV(TAG, "I am esp32 verbose log");
}void wl_logging_lib_show()
{WL_LOGE(TAG, "I am wireless link(wl) error log");WL_LOGW(TAG, "I am wireless link(wl) warning log");WL_LOGI(TAG, "I am wireless link(wl) info log");WL_LOGD(TAG, "I am wireless link(wl) debug log");WL_LOGV(TAG, "I am wireless link(wl) verbose log");
}void app_main(void)
{esp32_logging_lib_show();wl_logging_lib_show();
}
输出效果
这个并不是让你在esp32中让你使用自己的log系统(当然你也可以),而是介绍下log系统想分log等级以及模块其实没有那么复杂的!!
通过ESP32 logging库来启发我们的思维吧~~相关推荐
- python中logging库使用总结
logging库基础使用 前言:logging库是Python的日志管理软件,类似print但是比它更加强大,python自带的库. logging库的日志级别 DEBUG:详细信息,调试信息. IN ...
- Arduino ESP32 第三方库读取SD卡信息(三)
Arduino ESP32 第三方库读取SD卡信息(三) 相关篇<Arduino ESP32 第三方库读取SD卡信息(一)> <Arduino ESP32 第三方库读取SD卡信息(二 ...
- ESP32 LOG库使用
ESP32 log库 官方文档 一.printf是不可重入函数 printf不能在中断中被调用的原因是它是一个不可重入函数,而在中断中要避免调用不可重入函数,首先我们先说说什么是不可重入函数. 简单说 ...
- Python logging库
Python logging库 1. logging 简介 2. Basic logging Tutorial 2.1 使用logging 屏幕打印 2.2 使用logging 保存文件 2.3 多个 ...
- 第四章 使用logging库记录日志信息-4.3
感谢大家关注,帮忙分享呦,你们的阅读就是我的动力!!! 公众号:小李测试随笔 第四章 使用logging库记录日志信息-4.3 实例 4.3 日志记录实例应用 接下来通过一个程序片段来演示日志记录的过 ...
- esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案
esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案 打开Arduino库文件目录,找到TFT_eSPI文件夹,打开如图片所示的目录 st7789 135x240 和 240x240屏幕 ...
- 真·电子二胡 (ESP32配合库乐队APP实现的电子制作)
简介: 本项目是使用ESP32模块实现的一个电子二胡,可以连接手机库乐队在手机上演奏音乐 演示视频: 自制[电子]二胡,演奏二泉映月 软件原理图: 核心元器件是16个机械键盘的按键和一个EC11编码器 ...
- ESP32学习--库添加
在esp32工程中添加第三方库 添加第三方库工程中main文件夹下的lib文件夹中 在main文件的CMakeLists.txt 文件中添加一下代码 add_subdirectory(lib/tiny ...
- ESP32+PlatformIO库开发--TFT_eSPI库例程解析(学习笔记1)
文章目录 前言 一.TFT_Clock_Digital例程简介 二.代码记录 1.初始化全局变量 2.conv2d()函数 3.初始化 4.loop循环中的程序段 总结 前言 本文主要记录自己在VSC ...
- 用Steam教育启发学生多元化思维
STEAM教育有明显长处:从现实中选题,为什么要在现实当中选题呢?这看似是个简单的问题,实际上大有研究.学生所接触和学习的课程无论物理.化学.生物.历史.地理.政治等等都是脱离现实的,都是过去的知识, ...
最新文章
- C#之windows桌面软件第五课:串口助手实现定时关闭设备、鼠标移动使按钮颜色变化功能
- 用Reflector和FileDisassembler配合反编译.net Windows程序
- bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
- [算法]-排序算法之希尔排序
- android addtextchangedlistener参数,【Android】关于addTextChangedListener()方法的上机记录...
- 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?...
- 正反对角线java表示_连接4对角线Win Check
- 手写 Object.create
- 2022 智能语音技术最新进展与发展趋势
- 写地道的Python
- CentOS 安装 PPTP ××× 客户端安装脚本
- 中国制鞋机械行业调研与投资战略报告(2022版)
- 【基础】SAP 新增计量单位
- 139邮箱注册收费吗,什么VIP的邮箱安全又好用呢
- python字符串修改
- Leetcode刷题-最长公共前缀
- OpenCV python 图片镜像
- python爬虫(四)数据存储
- 带特殊符号|的字符串的截取
- 权限管理系统(包括审批流程)数据库设计图
热门文章
- windows环境下sqlmap安装教程及问题详解
- 计算机导论中如何求模,计算机导论作业答案
- FastJson之autotype bypass
- RemObjects Elements多用途软件开发
- Webservice工具soapUI下载和使用
- 一种基于LCD1602和AT24C02的单片机多功能电子密码锁设计(附论文+Proteus仿真+C程序等)
- 火了!GitHub标星三万,Python抢票神器
- 免费的谷歌翻译api,Google Translate API
- 《FLUENT 14.0超级学习手册》——3.2 Gambit的应用
- 追求神乎其技的程式设计之道