零. 声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇: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库来启发我们的思维吧~~相关推荐

  1. python中logging库使用总结

    logging库基础使用 前言:logging库是Python的日志管理软件,类似print但是比它更加强大,python自带的库. logging库的日志级别 DEBUG:详细信息,调试信息. IN ...

  2. Arduino ESP32 第三方库读取SD卡信息(三)

    Arduino ESP32 第三方库读取SD卡信息(三) 相关篇<Arduino ESP32 第三方库读取SD卡信息(一)> <Arduino ESP32 第三方库读取SD卡信息(二 ...

  3. ESP32 LOG库使用

    ESP32 log库 官方文档 一.printf是不可重入函数 printf不能在中断中被调用的原因是它是一个不可重入函数,而在中断中要避免调用不可重入函数,首先我们先说说什么是不可重入函数. 简单说 ...

  4. Python logging库

    Python logging库 1. logging 简介 2. Basic logging Tutorial 2.1 使用logging 屏幕打印 2.2 使用logging 保存文件 2.3 多个 ...

  5. 第四章 使用logging库记录日志信息-4.3

    感谢大家关注,帮忙分享呦,你们的阅读就是我的动力!!! 公众号:小李测试随笔 第四章 使用logging库记录日志信息-4.3 实例 4.3 日志记录实例应用 接下来通过一个程序片段来演示日志记录的过 ...

  6. esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案

    esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案 打开Arduino库文件目录,找到TFT_eSPI文件夹,打开如图片所示的目录 st7789 135x240 和 240x240屏幕 ...

  7. 真·电子二胡 (ESP32配合库乐队APP实现的电子制作)

    简介: 本项目是使用ESP32模块实现的一个电子二胡,可以连接手机库乐队在手机上演奏音乐 演示视频: 自制[电子]二胡,演奏二泉映月 软件原理图: 核心元器件是16个机械键盘的按键和一个EC11编码器 ...

  8. ESP32学习--库添加

    在esp32工程中添加第三方库 添加第三方库工程中main文件夹下的lib文件夹中 在main文件的CMakeLists.txt 文件中添加一下代码 add_subdirectory(lib/tiny ...

  9. ESP32+PlatformIO库开发--TFT_eSPI库例程解析(学习笔记1)

    文章目录 前言 一.TFT_Clock_Digital例程简介 二.代码记录 1.初始化全局变量 2.conv2d()函数 3.初始化 4.loop循环中的程序段 总结 前言 本文主要记录自己在VSC ...

  10. 用Steam教育启发学生多元化思维

    STEAM教育有明显长处:从现实中选题,为什么要在现实当中选题呢?这看似是个简单的问题,实际上大有研究.学生所接触和学习的课程无论物理.化学.生物.历史.地理.政治等等都是脱离现实的,都是过去的知识, ...

最新文章

  1. C#之windows桌面软件第五课:串口助手实现定时关闭设备、鼠标移动使按钮颜色变化功能
  2. 用Reflector和FileDisassembler配合反编译.net Windows程序
  3. bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
  4. [算法]-排序算法之希尔排序
  5. android addtextchangedlistener参数,【Android】关于addTextChangedListener()方法的上机记录...
  6. 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?...
  7. 正反对角线java表示_连接4对角线Win Check
  8. 手写 Object.create
  9. 2022 智能语音技术最新进展与发展趋势
  10. 写地道的Python
  11. CentOS 安装 PPTP ××× 客户端安装脚本
  12. 中国制鞋机械行业调研与投资战略报告(2022版)
  13. 【基础】SAP 新增计量单位
  14. 139邮箱注册收费吗,什么VIP的邮箱安全又好用呢
  15. python字符串修改
  16. Leetcode刷题-最长公共前缀
  17. OpenCV python 图片镜像
  18. python爬虫(四)数据存储
  19. 带特殊符号|的字符串的截取
  20. 权限管理系统(包括审批流程)数据库设计图

热门文章

  1. windows环境下sqlmap安装教程及问题详解
  2. 计算机导论中如何求模,计算机导论作业答案
  3. FastJson之autotype bypass
  4. RemObjects Elements多用途软件开发
  5. Webservice工具soapUI下载和使用
  6. 一种基于LCD1602和AT24C02的单片机多功能电子密码锁设计(附论文+Proteus仿真+C程序等)
  7. 火了!GitHub标星三万,Python抢票神器
  8. 免费的谷歌翻译api,Google Translate API
  9. 《FLUENT 14.0超级学习手册》——3.2 Gambit的应用
  10. 追求神乎其技的程式设计之道