【单片机笔记】如何编写一个清晰的串口日志输出DEBUG文件(附源码)
前言:
相信大多数嵌入式开发者都会碰到对程序进行调试或者查找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 演示效果 ★ 遇到喜欢 ...
- html怎么让方块自动旋转,如何使用纯CSS实现一个圆环旋转错觉的动画效果(附源码)...
本篇文章给大家带来的内容是关于如何使用纯CSS实现一个圆环旋转错觉的动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码下载 https://github.com ...
- 一个快速测试PlayCanvas Demo 的工程(内附源码)
PlayCanvas Paoject 一个快速测试PlayCanvas Demo 的工程. 源码下载: PlayCanvas Paoject下载地址 操作说明: 1.安装依赖 npm install ...
- 【C语言】第一个C语言项目——“猜数字”游戏(内附源码)
君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello米娜桑,这里是君兮_,今天又抽空为大家更新我们的主线0基础C语言啦!鉴于最近讲解了非常多的选择语句与循环语句,咱们今天就来讲讲 ...
- 如何使用javascript制作一个网页端3D贪吃蛇游戏(附源码及链接)
先来看游戏的最终效果: 3D网页版贪吃蛇游戏 下面来具体讲一下如何实现. 该游戏使用Hightopo的SDK制作,总共100多行代码,没有WebGL基础的同学们也可很快掌握. 场景初始化 首先,我们对 ...
- 基于matlab的串口通信,基于Matlab GUI的单片机串口与PC的通信 附源码
我也是最近学习单片机和MATLAB的小白平时在看学习的时候 下载了一些有价值的参考文献 概述采用51单片机,atmel的STC89C52RC芯片,主要用到的是七段数码管用来做一个时钟,程序编写软件为k ...
- 用Python打造一个AI作家为你写诗(附源码)
从短篇故事到长达5万词的小说,机器正以不可思议的方式"把玩"文字.网上已经涌现很多例子,越来越多人让机器创作文字作品. 其实,由于自然语言处理(NLP)领域的重大进步,如今计算机的 ...
- Android串口编程--开关灯Demo(附源码)
1.项目简述 第二次玩硬件了,第一次是通过局域网控制门的开关,这次是通过ZB(大概就是这么叫,具体名字不清楚)控制灯的开关,感觉控制硬件也就是给硬件发个byte数组而已. 这里有个框架usb-seri ...
- Android串口通信实例分析【附源码】
Android 串口通信实例分析,用的时开源的android-serialport-api 这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖- ...
最新文章
- mysql高级版本的默认密码_MySQL高版本默认密码查找
- 下载安装webstrom及激活
- 网页中二维码识别规则
- python dataframe批量将列名加后缀_Python中的dataframe对象如何用相同的列名堆叠两个表,并从行堆叠它们以形成一个表,Dataframe,将,具有,叠加,起来,上,组成...
- c语言序列化后只有四位小数,《C编程.高级C》4.序列化
- 比特币的双花和51%算力攻击
- 在.NET中探测U盘的插入/拔出
- [HihoCoder1369]网络流一·Ford-Fulkerson算法
- spine基础以及骨骼动画的使用(1)
- 硬核教程 - 使用Rust编写网游FPS外挂辅助
- Python 如何检测敏感词汇
- doc 问卷调查模板表_问卷调查Word模板.doc
- 读书会 | 第一季读书会《蛤蟆先生去看心理医生》完美收官啦
- 再见了, 达叔!我用Python回顾一代喜剧大师203部作品,太经典了!
- 三顾茅庐:刘备如何面试诸葛亮
- java 查看内存占用_查看JVM内存使用状况
- palette gef_GEF走向3D
- PS-Photoshop2020版安装包以及安装详细教程
- JAVA IO流(内存流、管道流、打印流)
- 5、SAMBA服务一:参数详解