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

审核编辑:汤梓红

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

    关注

    5068

    文章

    19014

    浏览量

    303195
  • C语言
    +关注

    关注

    180

    文章

    7598

    浏览量

    136162
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76178
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80840
  • 日志
    +关注

    关注

    0

    文章

    138

    浏览量

    10632

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

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

收藏 人收藏

    评论

    相关推荐

    InDTU300系列产品如何输出实时日志

    “保存配置”,提示是否重启时,选择不重启。点击维护~实时日志。 点击开始接收,稍等几秒会看到模块输出的实时日志,故障复现后,依次点击停止接收~导出日志,将
    发表于 07-25 06:05

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

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

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

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

    如何编写dll文件

    如何编写dll文件:可以用几种语言来实现,如delphi编写dll,pb编写dll文件,java 编写
    发表于 01-16 10:20 8842次阅读

    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次下载

    Linux系统日志文件中的JFS文件系统

    嵌入式linux中文站向大家介绍一下JFS文件系统。Linux系统日志文件中的JFS系统, JFS 由IBM 公司开发,最初出现在AIX 操作系统之上,它提供了基于日志的字节级、面向事
    发表于 05-05 14:10 5014次阅读
    Linux系统<b class='flag-5'>日志</b><b class='flag-5'>文件</b>中的JFS<b class='flag-5'>文件</b>系统

    单片机对日志系统的设计

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

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

    日志 本文来聊聊文件系统中的日志系统,来看一个简单的日志系统是如何实现的。本文是接着前面的 xv6 系列,用到的一些前导知识不再说明,没看的可以先看一下。
    的头像 发表于 09-29 11:04 2175次阅读
    <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>技巧

    Python写入到日志文件完整代码

    写入到日志文件 上面我们说的是将日志打印到控制台中,但是我们Python代码写完并且在运行当中后,我们就不可能这样玩了,所以我们需要将日志保存到一个
    的头像 发表于 10-07 11:50 1210次阅读
    Python写入到<b class='flag-5'>日志</b><b class='flag-5'>文件</b>完整代码

    Loguru日志记录器的安装方式

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

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

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

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

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

    logcat命令抓取日志方法

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