ESP32S3的ESP_LOGx()控制台输出详细介绍

news2025/1/20 3:44:03

前言

(1)接触一款新的芯片,第一步要么是点灯,要么是进行串口的输出。现在我将介绍如何快速的利用ESP32S3进行控制台的日志输出。
(2)对于ESP32进行日志输出还是相对简单的,不像其他芯片需要配置波特率,设置数据位校验位等等的东西。简单很多,但是也给很多像我这种经常做单片机开发的骚年不安全感。虽然简单,但是用起来总感觉变扭。
(3)ESP32的很多操作,感觉和Linux有关,特别是本文要讲到的menuconfig配置,感觉就是与Linux内核裁剪差不多。这样会导致很多没有对这方面接触的兄弟们,看起来懵懵懂懂的。为了追求简单易懂,本文是通过vscode的ESP32-IDF插件进行设置。其他环境的我也会进行简单介绍。
(4)这边需要注意一点,如果你使用的是通过U0Tx,U0Rx,U1Tx,U1Rx。这种通过串口进行日志打印,会和通过USB数据线的日志打印有些许不同。

日志打印

日志的6个等级

(1)ESP32的日志输出是分等级的,他会根据预设的条件,通过编译器进行调整输出数据。
(2)而其他芯片不同,如果想给串口输出数据分级,需要通过宏定义处理。如下图

#include <stdio.h>

#define NO_output  0
#define Error      1
#define Warning    2
#define Info       3
#define Debug      4
#define Verbose    5
 
#define Set_LOG_Level Info  //设置日志输出等级

void main()
{
#if Set_LOG_Level >= Verbose
	printf("所有数据都打印\r\n");
#endif
#if Set_LOG_Level >= Debug
	printf("打印用于调试阶段的数据\r\n");
#endif
#if Set_LOG_Level >= Info
	printf("只打印一些普通信息\r\n");
#endif
#if Set_LOG_Level >= Warning
	printf("打印警告信息\r\n");
#endif
#if Set_LOG_Level >= Error
	printf("打印报错信息\r\n");
#endif
#if Set_LOG_Level >= NO_output 
	printf("不进行信息打印\r\n");
#endif
}

在这里插入图片描述

(3)根据上面这一段代码和测试结果我们就能够清晰的知道ESP32的日志打印工作原理。这种日志打印的分级没有什么好神秘的,其实就是利用的编译器预处理阶段,根据你本人设置的编译条件进行的处理。如果不相信的话,可以利用gcc的-E指令,对c文件只进行预处理,最终看到的结果如下:
注意:本人只截取了main()函数部分,因为预处理阶段,stdio.h 这个头文件信息都会被复制进入当前的C文件。不理解的可以看:深入理解C程序的#include和头文件,让c工程只有.h文件(狗头)

在这里插入图片描述

如何进行日志输出等级设置

(1)现在我们已经知道的日志等级的概念了,那么我如何设置输出的日志等级呢?对于上面的代码,我们是通过 #define Set_LOG_Level Info 这个宏来进行设置最终的日志输出等级的。
(2)这个根据操作环境不同使用方法不同,我先介绍最简单的办法。

vscode配置日志输出等级

在这里插入图片描述

其他环境中配置日志输出等级

(1)方法1:如下方法可能有些细节没有讲述,因为我不是哪个环境,只是通过资料得知大概思路是这样的。
<1>在命令行中输入idf.py menuconfig,进入配置界面。
<2>找到 Bootloader log verbosity 将其设置为Info即可。
(2)方法2:这个方法适配所有的环境
<1>在项目路径中找到sdkconfig文件

在这里插入图片描述

<2>搜索Bootloader config,找到下面这几段话,根据需求复制粘贴我的下面配置,最后保存即可。因为太多了,我就只举三个例子。

/*--- 日志输出等级为INFO ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=3
/*--- 日志输出等级为DEBUG ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set
CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG=y
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=4
/*--- 日志输出等级为VERBOSE ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE=y
CONFIG_BOOTLOADER_LOG_LEVEL=5

日志输出函数介绍

(1)如下为我们可以使用的几个函数(准确来说其实是宏定义,感兴趣的可以看一下他的实现原理)。
(2)日志输出等级如果设置为INFO,那么ESP_LOGI(),ESP_LOGW(),ESP_LOGE()这几个函数的打印信息可以输出。

ESP_LOGE() // 错误
ESP_LOGW() // 警告
ESP_LOGI() // 信息
ESP_LOGD() // 调试
ESP_LOGV() // 详细

(3)ESP_LOGx()这类型的宏使用,第一个都是一个字符串。一般是用于说明执行到了哪一个文件中,后续通过查看日志信息,就可以根据第一个字符串快速定位到出问题的代码。
(4)第二个参数也是一个字符串,这个字符串里面的%可以决定之后的可变参数能够拥有几个。
题外话:如果想了解可变参数的原理可看如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?

static const char *TAG = "main";
ESP_LOGI(TAG, "tast1: 1");
ESP_LOGI(TAG, "Compile time: %s %s", __DATE__, __TIME__);

(5)vscode中查看日志信息方法:

在这里插入图片描述

(6)其他平台中查看日志信息方法,输入下面命令行开始监控

idf.py monitor

关于日志打印不全问题

(1)之前我USB的端口一直识别不到,所以一开始对ESP32S3是使用的CH340通过串口进行烧录程序的。之后研究ESP_LOGx()控制台输出的时候,发现我的ESP_LOGI()一直无法输出数据,折磨的我想吐。
(2)后面联系到乐鑫的官方工作人员,才知道问题所在。
(3)进入menuconfig配置界面,搜索Channel for console output,即可设置ESP_LOGx()控制台输出设置。
(4)下面这一段是关于这个配置选项的介绍,说实话,我本人没看懂就不乱介绍了。图片中的那个配置是根据乐鑫的官方工作人员的说明来些的,所以不会有问题。
<1>默认情况下,在预定义的gpio上使用UART0。
<2>如果选择“Custom”,可以选择UART0或UART1,并且可以选择任意引脚。
<3>如果选择“None”,则除了ROM引导程序的初始输出外,任何UART上都不会有控制台输出。该ROM输出可以通过GPIO捆扎或EFUSE抑制,详细信息请参阅芯片数据表。
<4>在带有USB OTG外设的芯片上,“USB CDC”选项将输出重定向到CDC端口。此选项使用芯片ROM中的CDC驱动程序,此选项与TinyUSB堆栈不兼容。
<5>在带有USB串行/JTAG调试控制器的芯片上,选择该选项可将输出重定向到该设备的CDC/ACM(串行端口仿真)组件。

在这里插入图片描述

(5)其他平台:
<1>在命令行中输入idf.py menuconfig,进入配置界面。
<2>顶层目录—>Component config—>ESP System Settings—>找到Channel for console output (Default: UART0)并且选中。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析

三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析 三维模型的轻量化压缩是一项技术挑战&#xff0c;特别是在处理复杂的3DTile格式时。下面列举了一些处理过程中可能遇到的常见问题以及相应的处理方法&#xff1a; 模型精度损失&#xff1a;在进行压缩处理时&#x…

C语言入门Day_19 初识函数

目录 1.函数的定义 2.函数的调用 3.易错点 4.思维导图 前言&#xff1a; printf()我们已经很熟悉了&#xff0c;它有一个特定的功能&#xff0c;就是在屏幕上输出一行文字。之前的课程我们都称呼printf()为一个功能&#xff0c;实际上ta在编程中有个特定的名字——函数。 …

IO和进程day07(IPC、管道、信号)

今日任务 1.代码&#xff08;一次只能发一次消息&#xff0c;不然会存在一些小问题&#xff0c;在接受消息之后会立刻输出上次的第二次发送的消息&#xff09; read.c文件&#xff08;先读取消息&#xff09; #include <stdio.h> #include <string.h> #include &…

org.apache.ibatis.binding.BindingException: Invalid bound statement

在学习黑马头条遇到的关于使用mapper执行方法出现的错误 完整报错信息为&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.heima.wemedia.mapper.WmNewsMaterialMapper.saveRelations 译为&#xff1a;无效的绑定语句&…

Ubuntu 23.10/24.04 LTS 放弃默认使用 snap 版 CUPS 打印堆栈

导读Canonical 的开发者、OpenPrinting 的项目负责人 Till Kamppeter 今年 5 月表示&#xff0c;计划在 Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;上默认使用 Snap 版本的 CUPS 打印堆栈。 不过经过数月的测试&#xff0c;官方放弃了这项决定。Ubuntu 23.10&#x…

MySQL面试题——隔离级别相关面试题

隔离级别相关面试题 MySQL事务隔离级别 未提交读——可以读到其他事务未提交的数据&#xff08;最新的版本&#xff09; 错误现象&#xff1a;脏读、不可重复读、幻读的现象 提交读&#xff08;RC&#xff09;——可以读到其他事务已提交的数据&#xff08;最新已提交的版本&…

TypeScript命名空间和模块

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 命名空间&#xff08;Namespace&#xff09; 命名空间&#xff08;Namespace&#xff09;使用场景 第三方库 兼容…

蓝桥杯官网填空题(迷宫)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 X 星球的一处迷宫游乐场建在某个小山坡上。它是由 1010 相互连通的小房间组成的。 房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立&#xff0…

Spring 的创建和日志框架的整合

目录 一、第一个 Spring 项目 1、配置环境 2、Spring 的 jar 包 Maven 项目导入 jar 包和设置国内源的方法&#xff1a; 3、Spring 的配置文件 4、Spring 的核心 API ApplicationContext 4、程序开发 5、细节分析 &#xff08;1&#xff09;名词解释 &#xff08;2&…

LeetCode 362 期周赛

8029.与车相交的点 题目&#xff1a; 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i&#xff0c;nums[i] [starti, endi] &#xff0c;其中 starti 是第 i 辆车的起点&#xff0c;endi 是第 i 辆车的终点。 返回数轴上被车 任意部…

自动化控制系统的设计重点是什么?

要实现对选择性激光烧结系统预热温度的控制&#xff0c;需要找到合理的控制对象模型&#xff0c;但选择性激光烧结设备的预热温度场是一个复杂的非线性系统&#xff0c;很难找到合理的控制对象模型来实现预热温度场的温度控制。模糊控制不需要具体的控制模型&#xff0c;预热温…

Linux命令200例:dnsconf用于配置和管理域名解析服务

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

极限的概念与性质

目录 极限的概念 极限的性质 极限的存在准则 极限的概念 极限是数学中的分支——微积分的基础概念&#xff0c;它表示无限趋近于一个固定的数值的过程。在高等数学中&#xff0c;极限可以分为数列极限和函数极限。 1.数列的极限 数列的极限是指对于一个数列{an}中的任意一…

socket编程|TCP

一.套接字概念 套接字&#xff08;Socket&#xff09;是一种用于网络通信的编程接口&#xff0c;它提供了一种机制&#xff0c;使得不同计算机上的应用程序能够通过网络进行通信和交换数据。 套接字可以看作是应用程序和网络之间的端点&#xff0c;它定义了应用程序与网络之间…

400电话:提供全方位客户服务的热线电话

随着现代社会的发展&#xff0c;企业和机构越来越重视客户服务的质量和效率。为了更好地满足客户的需求&#xff0c;提供及时的帮助和解决方案&#xff0c;许多企业纷纷引入了400电话这一全方位客户服务的热线电话。 400电话是一种以4开头的电话号码&#xff0c;通过该号码可以…

[论文阅读]Coordinate Attention for Efficient Mobile Network Design

摘要 最近关于移动网络设计的研究已经证明了通道注意力(例如&#xff0c; the Squeeze-and-Excitation attention)对于提高模型的性能有显著的效果&#xff0c;但它们通常忽略了位置信息&#xff0c;而位置信息对于生成空间选择性注意图非常重要。在本文中&#xff0c;我们提出…

Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)

目录 Redis 三种特殊的数据类型&#xff1a; Geospatial&#xff1a;地理位置 Geospatial类型常用的命令&#xff1a; GEOADD&#xff1a;添加地理位置 GEOPOS&#xff1a;获取地理位置 GEODIST&#xff1a;返回两个给定位置之间的距离 GEORADIUS&#xff1a;以给定的经纬…

公司电脑文件加密防泄密软件系统——「天锐绿盾」

天锐绿盾是一款功能强大的公司电脑文件加密防泄密软件系统&#xff0c;旨在保护企业的知识产权和商业机密。 PC访问地址&#xff1a;http://985.so/2y2n9 它具有以下几个主要特点&#xff1a; 文件加密&#xff1a;天锐绿盾会对存储在公司电脑上的所有敏感文件进行自动加密&am…

uniapp——实现电子签名功能——基础积累

话说&#xff0c;2020年刚来杭州的时候&#xff0c;有用到过uniapp&#xff0c;距今已有三年时间了&#xff0c;果然全忘了&#xff0c;哈哈[笑中带泪] 昨天遇到一个需求&#xff1a;就是要实现pdf文件的预览&#xff0c;着实费了我很多的时间&#xff0c;连晚饭都没有吃好。。…

uniapp——实现在线选座功能——技能提升

首先声明一点&#xff1a;下面的内容是从一个uniapp的程序中摘录的&#xff0c;并非本人所写&#xff0c;先做记录&#xff0c;以免后续遇到相似需求抓耳挠腮。 这里写目录标题 效果图代码——html部分cu-custom组件anil-seat组件 代码——jscss部分 效果图 代码——html部分 …