0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

串口日志输出DEBUG文件编写

技术让梦想更伟大 来源:CSDN-沉默的小宇宙 2023-09-21 09:21 次阅读


相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的。

有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方法便是加打印信息进行找问题。

打印的接口有很多种,比如串口,网络,显示等等。简单的硬件开发串口估计是最常用的。这里简单记录下一种日志打印方法。

目的:

1)方便查找打印日志 2)日志格式规范 3)可以查看用户添加信息,文件信息,函数接口,以及文件所在行号 4)支持format格式 5)可以支持实时时间

基本知识:

C语言中的__FILE__、LINE__和__FUNCTION

1、FILE用于指示本行代码所在源文件的文件名;

2、__LINE__用于指示本行代码所在源文件中的位置(行数);

3、__FUNCTION__用于指示本行代码所在函数(函数名);

注:

1)"FILE"、"LINE"、"FUNCTION"等均大小写敏感

2)支持需要添加头文件#include

源码

#defineDEBUG_EN(1u)

#if(DEBUG_EN)

#defineDEBUG_MAX_SIZE512
externcharszBuf[DEBUG_MAX_SIZE];

#defineDEBUG_INFO(format,...)do{
u16unLen=0;
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE,"[INFO][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen,format,##__VA_ARGS__);
usart1_send_buf_with_txe((u8*)szBuf,unLen);
}while(0)

#defineDEBUG_WARN(format,...)do{
u16unLen=0;
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE,"[WARN][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen,format,##__VA_ARGS__);
usart1_send_buf_with_txe((u8*)szBuf,unLen);
}while(0)

#defineDEBUG_ERR(format,...)do{
u16unLen=0;
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE,"[ERR][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);
unLen+=snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen,format,##__VA_ARGS__);
usart1_send_buf_with_txe((u8*)szBuf,unLen);
}while(0)

#elif

#defineDEBUG_INFO(...)
#defineDEBUG_WARN(...)
#defineDEBUG_ERR(...)

#endif

源码主要使用宏定义的方式,为了支持文件、行号,函数等等,不能使用单独的函数进行定义。具体原因可以思考下,不过多赘述。

C文件目前只有一个数组定义char szBuf[DEBUG_MAX_SIZE];。

为了兼容,INFO,WARN和ERR三个共用一个buf,声明全局变量更主要的一个原因是使用了串口的中断发送函数usart1_send_buf_with_txe,而不是循环发送完成再退出,这里传输是进行指针传递的,发送使用中断的好处就是高效率,不耽误其他程序跑。

当然移植的时候完全可以根据自己的接口和实现方式进行更换。

实现效果

[INFO][..sourcemain.c][@main][#36]:testStr[111],testInt[111],testHex[0x000015BC]
[WARN][..sourcemain.c][@main][#37]:testStr[111],testInt[111],testHex[0x000015BC]
[ERR][..sourcemain.c][@main][#38]:testStr[111],testInt[111],testHex[0x000015BC]

fcc57a04-5812-11ee-939d-92fbcf53809c.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4982

    文章

    18281

    浏览量

    288448
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128698
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74511
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79543
  • 日志
    +关注

    关注

    0

    文章

    126

    浏览量

    10525

原文标题:好用的嵌入式设备日志输出模块 log.h

文章出处:【微信号:技术让梦想更伟大,微信公众号:技术让梦想更伟大】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机断电记忆日志串口助手波形图像彩色日志 Stm32嵌入式FLASH保存日志管理工具

    ):仅在开发期间有用的调试消息,级别较低,在正式发布时一般不显示。 Buffer(阵列):以直接显示级别与Debug相同的阵列数值。 Fixer(固定位置):固定位置显示日志,不保存到日志文件
    发表于 01-19 11:28

    多任务环境下串口输出debug信息的方法是什么?

    楼主的程序是基于freeRTOS的,划分成了几个任务。为了方便调试,在一些地方增加了一些从串口输出debug信息的代码,同时为了方便在编译时去掉这些代码,我是用宏定义的方法在头文件里面
    发表于 07-20 08:03

    STM32串口通信程序编写输出Hello world

    目录STM32 串口通信程序编写输出Hello world打开keil,新建工程运行使用HAL库代码编写STM32 串口通信程序
    发表于 02-10 08:03

    讲讲调试程序的重要方法—打印日志

    :log_print将buf的前len字节的内容输出到调试串口(uart1),其实就是对串口输出函数进行简单的封装,使用户在输出
    发表于 06-20 17:14

    串口彩色波形显示日志助手 云控日志CloudLog.exe

    FwbConf.h中的配置信息。 5、使用之中有问题或建议可以提Issues或加QQ群857283039。 参考PlatformWindows目录下的main.c文件,您可以了解如何输出不同类型的日志
    发表于 09-06 16:51

    Linux日志文件系统解析

    在近代历史上,日志文件系统被认为十分奇特,主要是处于研究阶段。而如今,日志文件系统(ext3)已经成为 Linux的缺省文件系统。本文向大家
    发表于 11-01 15:23 0次下载
    Linux<b class='flag-5'>日志</b><b class='flag-5'>文件</b>系统解析

    Oracle核心技术之控制文件日志文件

    控制文件日志文件是Oracle数据库中储存信息的重要文件。控制文件用来存放数据库的名字、数据文件
    发表于 03-26 11:03 2次下载

    单片机对日志系统的设计

    为单片机设计了一套简单的日志系统,通过日志系统提供的接口可以查看设备状态,并进行一些基本的调试。 日志系统通过串口输出,所以单片机需要
    发表于 04-02 14:26 5075次阅读
    单片机对<b class='flag-5'>日志</b>系统的设计

    文件系统中的日志系统是如何实现的

    日志 本文来聊聊文件系统中的日志系统,来看一个简单的日志系统是如何实现的。本文是接着前面的 xv6 系列,用到的一些前导知识不再说明,没看的可以先看一下。
    的头像 发表于 09-29 11:04 1909次阅读
    <b class='flag-5'>文件</b>系统中的<b class='flag-5'>日志</b>系统是如何实现的

    嵌入式log打印格式输出技巧

    例:[info] main.c : init ok!例:[debug] adc.c : adc_getvalue -> 3.3v参考 Java 日志框架的输出方式:[ 文件名]
    发表于 10-20 21:06 5次下载
    嵌入式log打印格式<b class='flag-5'>输出</b>技巧

    分享一下C语言日志分级

    参考一些高级语言的分级日志设计,我们根据对程序运行信息的类型把控,可以把日志分为5个级别DEBUG、INFO、WARN、ERROR、FATAL。
    的头像 发表于 03-29 09:46 636次阅读

    Loguru日志记录器的安装方式

    这个强大工具的基本使用方法。 Loguru 安装方式很简单,打开终端输入: pip install loguru 即可完成安装。 1.即开即用 如果你需要输出 debug 日志到终端,可以这么做
    的头像 发表于 10-16 11:35 395次阅读
    Loguru<b class='flag-5'>日志</b>记录器的安装方式

    Loguru:一个能彻底解放你的日志记录器

    这个强大工具的基本使用方法。 Loguru 安装方式很简单,打开终端输入: pip install loguru 即可完成安装。 1.即开即用 在Loguru中,如果你需要输出 debug 日志到终端
    的头像 发表于 10-30 15:01 384次阅读
    Loguru:一个能彻底解放你的<b class='flag-5'>日志</b>记录器

    Loguru :彻底解放你的日志记录器

    这个强大工具的基本使用方法。 Loguru 安装方式很简单,打开终端输入: pip install loguru 即可完成安装。 1.即开即用 如果你需要输出 debug 日志到终端,可以这么做
    的头像 发表于 11-01 11:01 774次阅读
    Loguru :彻底解放你的<b class='flag-5'>日志</b>记录器

    logcat命令抓取日志方法

    -b main:抓取main缓冲区的日志; -b system:抓取system缓冲区的日志; -b crash:抓取crash缓冲区的日志; -r:每次输出多大
    的头像 发表于 11-23 17:31 539次阅读
    logcat命令抓取<b class='flag-5'>日志</b>方法