单片机控制调试信息输出的方法

单片机调试log信息输出控制方法

因子

最近在研发公司项目:基于无线通信的****物联网应用。过程中涉及到了多个程序模块,包括MQTT、JSON解析、二维码生成等。在单片机程序的编写过程中,串口的调试输出是一种非常有帮助的方式。以往我都是在设计中使用 printf 输出想要看到的关键变量,最后在发布版中在把这些 printf语句删除。之前写的都是小项目,代码可重用性不高,这次我想规范自己的代码,方便之后复用,于是有也考虑到了单模块.c和.h文件的调试输出。通过google和自己摸索,对于调试自己定义了这样一套方式:

  1. 首先将一个串口重定向到 printf 函数中。
  2. 其次在每个单独的模块.h文件中宏定义调试变量 ***_log(),指向printf函数,上述每个宏定义以文件模块为前缀进行命名,比如在mqtt头文件定义mqtt_,json头文件定义 json_log
  3. 最后,在开发过程中,打开改宏定义,调试完成一个模块,关闭一个模块的定义,直至发布版时取消所有宏定义,减轻之前删除多个printf的工作量。

栗子

以mqtt模块举例

//mqtt.h 文件

#define MQTT_LOG 1 //定义了DEBUG_LOG则输出调试信息 注释则不输出
#ifdef MQTT_LOG
//#define log(format,...) printf("FILE: "__FILE__", LINE: %d: "format"/n", __LINE__, ##__VA_ARGS__) //输出文件名和行号
#define mqtt_log(format,...) printf(format,##__VA_ARGS__)//不输出文件名和行号
#else
#define mqtt_log(format,...)
#endif

void MQTT_PingPacket(void)
{	
	u16 packet_len;              //整个包长度  包括固定报头 可变报头 负载
	u8  Ping_buff[10];           //订阅topic包缓冲区
	u16 i;
	
	packet_len= 2 ;              //整个包的长度,没有可变包和负载
	
	/*     固定包头        */
	Ping_buff[0]  = 0xC0;
	Ping_buff[1]  = packet_len-2;  
	
    
    //debug
    mqtt_log("发送 ping 服务器 报文:\r\n");
    for(i = 0;i < packet_len;i++)
	{			
		mqtt_log("%2X",Ping_buff[i]);
	}
    mqtt_log("\r\n");
    
    //发送ping包
	for(i = 0;i < packet_len;i ++)
	{			
		SerialWrite(&UART1,Ping_buff[i]);
	}	

}

重点代码解释

例子中#define DEBUG(format, …) printf (format, ##VA_ARGS)(’ ## '的意思是,如果可变参数被忽略或为空,将使预处理器( preprocessor )去除掉它前面的那个逗号。)

总结

以上代码使用与 IAR,keil未进行测试,应该是通用的。程序注重模块化和规范化,以往自己做的不太好,在9012年,希望规范自己的开发。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值