前言:

相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的。有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方法便是加打印信息进行找问题。打印的接口有很多种,比如串口,网络,显示等等。简单的硬件开发串口估计是最常用的。这里简单记录下我最近设计的一种日志打印方法。

目的:

1)方便查找打印日志

2)日志格式规范

3)可以查看用户添加信息,文件信息,函数接口,以及文件所在行号

4)支持format格式

5)*可以支持实时时间

基本知识:

C语言中的__FILE__、__LINE__和__FUNCTION__

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

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

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

注:

1)"__FILE__ "、"__LINE__"、"__FUNCTION__"等均大小写敏感

2)支持需要添加头文件#include<stdio.h>

源码

#define DEBUG_EN (1u)#if (DEBUG_EN)#define DEBUG_MAX_SIZE 512
extern char szBuf[DEBUG_MAX_SIZE];#define DEBUG_INFO( format, ... ) do{\u16 unLen = 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)#define DEBUG_WARN( format, ... ) do{\u16 unLen = 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)#define DEBUG_ERR( format, ... ) do{\u16 unLen = 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 #define DEBUG_INFO(...)
#define DEBUG_WARN(...)
#define DEBUG_ERR(...)#endif

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

C文件目前只有一个数组定义char szBuf[DEBUG_MAX_SIZE];。为了兼容,INFO,WARN和ERR三个公用一个buf,声明全局变量更主要的一个原因是使用了串口的中断发送函数usart1_send_buf_with_txe,而不是循环发送完成再退出,这里传输是进行指针传递的,发送使用中断的好处就是高效率,不耽误其他程序跑。当然移植的时候完全可以根据自己的接口和实现方式进行更换。

实现效果

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

更多资料及技术问题可以加技术交流群:733945348

By Urien 2021年8月7日 14:33:10

【单片机笔记】如何编写一个清晰的串口日志输出DEBUG文件(附源码)相关推荐

  1. 我搭建了一个随机「毒鸡汤」语录网站附源码下载

    小伙伴们注意:公众号的推送机制不再按照时间前后推送了,微信公众号信息流乱序.君哥建议大家把科技毒瘤君公众号置顶(设为星标⭐),以便第一时间看到推送,非常感谢~,方法如下图: 1 演示效果 ★ 遇到喜欢 ...

  2. html怎么让方块自动旋转,如何使用纯CSS实现一个圆环旋转错觉的动画效果(附源码)...

    本篇文章给大家带来的内容是关于如何使用纯CSS实现一个圆环旋转错觉的动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码下载 https://github.com ...

  3. 一个快速测试PlayCanvas Demo 的工程(内附源码)

    PlayCanvas Paoject 一个快速测试PlayCanvas Demo 的工程. 源码下载: PlayCanvas Paoject下载地址 操作说明: 1.安装依赖 npm install ...

  4. 【C语言】第一个C语言项目——“猜数字”游戏(内附源码)

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello米娜桑,这里是君兮_,今天又抽空为大家更新我们的主线0基础C语言啦!鉴于最近讲解了非常多的选择语句与循环语句,咱们今天就来讲讲 ...

  5. 如何使用javascript制作一个网页端3D贪吃蛇游戏(附源码及链接)

    先来看游戏的最终效果: 3D网页版贪吃蛇游戏 下面来具体讲一下如何实现. 该游戏使用Hightopo的SDK制作,总共100多行代码,没有WebGL基础的同学们也可很快掌握. 场景初始化 首先,我们对 ...

  6. 基于matlab的串口通信,基于Matlab GUI的单片机串口与PC的通信 附源码

    我也是最近学习单片机和MATLAB的小白平时在看学习的时候 下载了一些有价值的参考文献 概述采用51单片机,atmel的STC89C52RC芯片,主要用到的是七段数码管用来做一个时钟,程序编写软件为k ...

  7. 用Python打造一个AI作家为你写诗(附源码)

    从短篇故事到长达5万词的小说,机器正以不可思议的方式"把玩"文字.网上已经涌现很多例子,越来越多人让机器创作文字作品. 其实,由于自然语言处理(NLP)领域的重大进步,如今计算机的 ...

  8. Android串口编程--开关灯Demo(附源码)

    1.项目简述 第二次玩硬件了,第一次是通过局域网控制门的开关,这次是通过ZB(大概就是这么叫,具体名字不清楚)控制灯的开关,感觉控制硬件也就是给硬件发个byte数组而已. 这里有个框架usb-seri ...

  9. Android串口通信实例分析【附源码】

    Android 串口通信实例分析,用的时开源的android-serialport-api 这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖- ...

最新文章

  1. mysql高级版本的默认密码_MySQL高版本默认密码查找
  2. 下载安装webstrom及激活
  3. 网页中二维码识别规则
  4. python dataframe批量将列名加后缀_Python中的dataframe对象如何用相同的列名堆叠两个表,并从行堆叠它们以形成一个表,Dataframe,将,具有,叠加,起来,上,组成...
  5. c语言序列化后只有四位小数,《C编程.高级C》4.序列化
  6. 比特币的双花和51%算力攻击
  7. 在.NET中探测U盘的插入/拔出
  8. [HihoCoder1369]网络流一·Ford-Fulkerson算法
  9. spine基础以及骨骼动画的使用(1)
  10. 硬核教程 - 使用Rust编写网游FPS外挂辅助
  11. Python 如何检测敏感词汇
  12. doc 问卷调查模板表_问卷调查Word模板.doc
  13. 读书会 | 第一季读书会《蛤蟆先生去看心理医生》完美收官啦
  14. 再见了, 达叔!我用Python回顾一代喜剧大师203部作品,太经典了!
  15. 三顾茅庐:刘备如何面试诸葛亮
  16. java 查看内存占用_查看JVM内存使用状况
  17. palette gef_GEF走向3D
  18. PS-Photoshop2020版安装包以及安装详细教程
  19. JAVA IO流(内存流、管道流、打印流)
  20. 5、SAMBA服务一:参数详解

热门文章

  1. 如何增加微信视频号播放量,点赞量及上热门?
  2. 中国PostgreSQL培训认证——特别篇
  3. 获取百度地图上某点的经纬度信息(百度地图拾取坐标系统)
  4. 微信视频号直播1000个看过多少钱
  5. 软件设计-扇入(fan-in)/扇出(fan-out)
  6. ramos一键处理多合一_Primo Ramdisk驱RAMOS一键制作生成工具多合一 V3.2.5版
  7. 国家基因组科学数据中心(NGDC)---组学原始数据如何上传GSA
  8. 文件的安全和权限--suid和guid
  9. 微信小程序完整作品---微信商城
  10. 坚持初心,不被大环境所影响