串口打印调试信息(干货)

printf重定向到串口

上代码,这里用到的是hal库,标准库改以下函数就行。

#include <stdio.h>


int fputc(int ch, FILE *f)
{
          
   
	uint8_t temp[1] = {
          
   ch};
	HAL_UART_Transmit(&huart1, temp, 1, 5);  //huart1需要根据实际配置
	return ch;
}
int fgetc(FILE *f)
{
          
   
	uint8_t ch;
	HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 5);
	return ch;
}

因为上面这段代码我有经常使用到,所以可以把这段代码保存到keil里的模板里,需要用的时候双击即可,具体设置如下: 当需要这块代码就可以直接双击非常方便。

怎么优雅的打印串口信息

先上代码

#define USART_DEBUG

#ifdef USART_DEBUG
#define user_printf(format, ...) 		printf(format"
", ##__VA_ARGS__)
#define user_info(format, ...) 			printf(__FILE__"	[info]:"format"
", ##__VA_ARGS__)
#define user_debug(format, ...)			printf(__FILE__"	[debug]:"format"
", ##__VA_ARGS__)
#define user_error(format, ...) 		printf(__FILE__"	[error]:"format"
", ##__VA_ARGS__)
#else
#define user_printf(format, ...) 		//空;这几条函数不起不起作用
#define user_info(format, ...) 			
#define user_debug(format, ...)			
#define user_error(format, ...) 		
#endif

这块代码的作用: 1、可以结尾自动补充换行符,打印出文件目录。 2、用到了条件编译,当作品完成上交时不希望串口打印调试信息,可以取消这个宏定义,这样这几条串口打印函数就无效了。

补充:可变参数宏

#define user_printf(format, ...) 	printf(format"
", ##__VA_ARGS__)

简单理解:__VA_ARGS__ 就是传递参数用的,当没有传递参数 ##就会带走前面的逗号,是语法完整。

个性化打印串口信息

获取符号链接。 将每行符号复制下来 这里有报错的地方我们在前面添加一个反斜杠。 最后效果如下:

具体内容可以看这个。


2020.3.3 修改

#define USART_DEBUG
#ifdef USART_DEBUG

#define info_printf(format, ...) 			printf(__FILE__"	[info]:"format"
", ##__VA_ARGS__)
#define debug_printf(format, ...)			{ printf("%s",__FUNCTION__);
											printf("  [debug]:"format"
", ##__VA_ARGS__);}

#else
#define info_printf(format, ...) 
#define debug_printf(format, ...) 		
		
#endif
经验分享 程序员 微信小程序 职场和发展