printf串口打印数据以及进阶调试用法

一、前言

实现原理:

在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。

二、printf串口打印实现

首先要在一开始 #include <stdio.h>

1.使用LL库

添加下面的fputc重定义代码:

//重映射fputc函数,此函数为多个输出函数的基础函数
int fputc(int ch, FILE *f)
{
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
	USART_SendData(USART1, (uint8_t) ch);
	return ch;
}

2.使用HAL库

添加下面的fputc重定义代码:

int fputc(int c, FILE *stream)    //重写fputc函数
{
 /*
    huart1是工具生成代码定义的UART1结构体,
    如果以后要使用其他串口打印,只需要把这个结构体改成其他UART结构体。
*/
    HAL_UART_Transmit(&huart1, (unsigned char *)&c, 1, 1000);   
    return 1;
}

不成功的话,Use MicroLIB 打钩试一下
在这里插入图片描述

三、进阶使用:利用printf调试

示例:

#include <stdio.h>

/*宏定义调试输出格式*/
#define DEBUG(format,...)  printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)

int main(void)
{
    printf("file=%s\n", __FILE__);
    printf("line=%d\n", __LINE__);
    printf("Date=%s\n", __DATE__);
    printf("Time=%s\n", __TIME__);

    DEBUG("Data:%d\n", 123);
}

输出效果:

在这里插入图片描述

补充:

__FILE__ 代码所在文件

__LINE__ 代码所在行号

__FUNCTION__ 代码所在函数名

__DATE__ 代码编译的日期

__TIME__ 代码编译的时间

##__VA_ARGS__ 用于在宏替换部分中,表示可变参数列表

详细介绍可参考:#、##、__VA_ARGS__的使用

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值