串口打印调试信息(干货)
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
