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

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

3天内不再提示

C语言打印程序行号、日期方便调试程序

DS小龙哥-嵌入式威廉希尔官方网站 来源:DS小龙哥-嵌入式威廉希尔官方网站 作者:DS小龙哥-嵌入式技 2022-09-09 11:43 次阅读

【摘要】 平时开发C语言程序时,经常需要调试代码,C语言有一些宏,可以打印出当前的行号、文件名称、日期、时间,对程序的调试起到很大的帮助,可以快速定位问题。特别是开发单片机程序时,使用这些宏打印这些信息或者在LCD上显示程序的编译日期、时间,可以知道这个单片机上的固件是什么时候编译。帮助判断版本。

一、前言

平时开发C语言程序时,经常需要调试代码,C语言有一些宏,可以打印出当前的行号、文件名称、日期、时间,对程序的调试起到很大的帮助,可以快速定位问题。特别是开发单片机程序时,使用这些宏打印这些信息或者在LCD上显示程序的编译日期、时间,可以知道这个单片机上的固件是什么时候编译。帮助判断版本。

ANSIC标准定义了可供C语言使用的预定义宏:
__LINE__ : 在源代码中插入当前源代码行号
__FILE__ : 在源代码中插入当前源代码文件名
__DATE__ : 在源代码中插入当前编译日期
__TIME__ : 在源代码中插入当前编译时间

其中标识符__LINE__和__FILE__一般用来调试程序,打印信息,方便定位错误。

标识符__DATE__和__TIME__一般可以用来表示固件的版本,方便了解运行的程序是什么时候的版本。

标识符__LINE__是一个整数,其他的文件名称、日期、时间都是字符串。

二、打印示例

printf("编译日期与时间: %s,%s\n", __DATE__,__TIME__);
printf("当前所在行号:%d\r\n", __LINE__);
printf("当前源文件名称:%s\r\n", __FILE__);
printf("当前固件编译日期:%s\r\n", __DATE__);
printf("当前固件编译时间:%s\r\n", __TIME__);
image-20220507175252472

三、C语言封装快捷Debug

#define DEBUG

#ifdef DEBUG
static int DebugPrintf(const char *format, ...)
{
	va_list arg_data;
	int     count;
	va_start(arg_data, format);                  /*  获取可变参数列表  */
	fflush(stdout);                              /*  强制刷新输出缓冲区  */
	count = vfprintf(stderr, format, arg_data);  /*  将信息输出到标准出错流设备  */
	va_end(arg_data);                            /*  可变参数列表结束  */
	return count;
}
#else
static inline int DebugPrintf(const char *format, ...)
{

}
#endif

通过DEBUG这个宏来开启是否开启调试信息打印功能,如果程序稳定后,不需要打印调试信息,就可以将DEBUG的定义取消掉即可。

完整代码:

#include 
#include 
#include 
#include 
#include 
#include   
#include  

using namespace std;

//#define DEBUG

#ifdef DEBUG
static int DebugPrintf(const char *format, ...)
{
	va_list arg_data;
	int     count;
	va_start(arg_data, format);                  /*  获取可变参数列表  */
	fflush(stdout);                              /*  强制刷新输出缓冲区  */
	count = vfprintf(stderr, format, arg_data);  /*  将信息输出到标准出错流设备  */
	va_end(arg_data);                            /*  可变参数列表结束  */
	return count;
}
#else
static inline int DebugPrintf(const char *format, ...)
{
	return 0;
}
#endif
int main()
{
	DebugPrintf("编译日期与时间: %s,%s\n", __DATE__,__TIME__);
	DebugPrintf("当前所在行号:%d\r\n", __LINE__);
	DebugPrintf("当前源文件名称:%s\r\n", __FILE__);
	DebugPrintf("当前固件编译日期:%s\r\n", __DATE__);
	DebugPrintf("当前固件编译时间:%s\r\n", __TIME__);
	return 0;
}

四、STM32单片机上封装printf函数

/*
函数功能: 字符串发送
*/
void USARTx_StringSend(USART_TypeDef *USARTx,u8 *str)
{
   while(*str!='\0')
   {
       USARTx->DR=*str++;
       while(!(USARTx->SR&1<<7)){}
   }
}

//printf函数底层函数接口
int fputc(int c, FILE* stream)
{
    USART1->DR=c;
    while(!(USART1->SR&1<<7)){}
    return c;
}

/*
函数功能: 格式化打印函数
*/
char USART1_PRINTF_BUFF[1024];
void USART1_Printf(char *fmt,...)
{
   va_list ap;
   /*1. 初始化形参列表*/
   va_start(ap,fmt);
   /*2. 提取可变形参数据*/
    vsprintf(USART1_PRINTF_BUFF,fmt,ap);
   /*3. 结束,释放空间*/
    va_end(ap);
   /*4. 输出数据到串口1*/
   USARTx_StringSend(USART1,(u8*)USART1_PRINTF_BUFF);
   
   //USART1_Printf("%d%s",123,454656); 
   //int data=va_arg(ap,int);
}

USART1_Printf的用法与printf是一样的,通过这个函数就可以实现数据打印到任意地方,包括改成存储到SD卡上。

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

    关注

    6036

    文章

    44557

    浏览量

    635084
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136782
  • 程序
    +关注

    关注

    117

    文章

    3786

    浏览量

    81028
收藏 人收藏

    评论

    相关推荐

    串口调试程序

    串口调试程序
    发表于 03-15 12:27 30次下载
    串口<b class='flag-5'>调试程序</b>

    基于Labview的通用串口调试程序

    基于Labview的通用串口调试程序 使用方法: 1.在baud rate里设置通讯的波特率 2.在milliseconds to wait的毫秒数要大于等于20,这样可以保证收发数据的成 功率. 3.
    发表于 05-05 11:19 248次下载

    如何为程序代码加上行号

    若需要将程序代码放进词交报告或做文件时,或许我们会想将程序代码加上行号方便讲解,如同博客园显示程序代码那样,我们该如何做呢?
    发表于 05-10 08:17 2190次阅读

    微机原理调试程序

    微机原理调试程序,32位操作系统才能正常使用。
    发表于 11-09 14:47 2次下载

    903双模程序-调试程序

    903双模程序-调试程序 三相无刷BLDC应用程序
    发表于 11-10 10:45 13次下载

    SSCOM32_串口调试程序

    串口调试程序 自己测试已经通过可以使用
    发表于 12-24 10:52 59次下载

    串口调试程序

    串口调试程序,单片机学习好资料,欢迎下载学习。
    发表于 03-22 17:34 22次下载

    小车电机pwm调试程序

    小车电机pwm调试程序,原理图配套,原理图是按照驱动芯片l298来实现的。
    发表于 04-05 15:36 9次下载

    智能小车调试程序

    智能小车51单片机调试程序,带PWM调制和使能端控制。希望大家一起相互学习
    发表于 07-25 10:58 14次下载

    JTAG 链调试程序工具的作用及应用

    JTAG 链调试程序工具
    的头像 发表于 06-20 01:00 4031次阅读
    JTAG 链<b class='flag-5'>调试程序</b>工具的作用及应用

    串口调试程序火灾报警器调试工具C语言程序免费下载

    本文档的主要内容详细介绍的是串口调试程序火灾报警器调试工具C语言程序免费下载。
    发表于 10-22 17:39 36次下载
    串口<b class='flag-5'>调试</b>小<b class='flag-5'>程序</b>火灾报警器<b class='flag-5'>调试</b>工具<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>程序</b>免费下载

    很实用的串口调试程序免费下载

    本文档的主要内容详细介绍的是很实用的串口调试程序免费下载。
    发表于 01-17 08:00 5次下载
    很实用的串口<b class='flag-5'>调试程序</b>免费下载

    Linux用日志打印的方式调试程序

    一般来说,初学编程者所写的第一个程序,就是使用printf打印“Hello world”。其实printf的功效远不只这些,在程序调试方面,printf也有非常大的用处。
    发表于 05-13 11:31 3544次阅读

    基于STM32的蓝牙HC05调试程序 通过手机控制STM32单片机程序

    基于STM32的蓝牙HC05调试程序 通过手机控制STM32单片机程序
    发表于 11-24 12:36 122次下载
    基于STM32的蓝牙HC05<b class='flag-5'>调试程序</b> 通过手机控制STM32单片机<b class='flag-5'>程序</b>

    STC串口驱动调试程序

    STC的串口驱动调试程序
    发表于 07-08 14:23 3次下载