STM32自定义printf功能方法

最近在朋友那学到了如何重定义STM32的printf类似函数,在这做下记录:

调用C语言库函数文件具体是哪一个我忘记了,都加上吧  ^_^ 

#include <stdio.h>                        //uart redirect fputc
#include <string.h>                        //copy function
#include <stdarg.h>                        //va_start /vsnprintf /va_end function
 

1、功能函数:


#define DEBUG_UART		&huart2		//串口调试口


/******************************************************************************************
*** 函数名称: Debug_Printf
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:自定义串口 printf功能
*** 功能说明:
***	编者										时间 							    版本
***	XX										2020/12/8								V0.1
******************************************************************************************/ 
void Debug_Printf(UART_HandleTypeDef *huart, char *format, ...)
{
	uint8_t uart_buff[256];
	uint8_t *pStr = uart_buff;	
	uint16_t delay_max;	
	va_list ap;
	
	va_start(ap, format);	                					//初始化 ap 变量
	vsnprintf((char *)pStr, sizeof(uart_buff), format, ap);		//可变参数。用于向字符串中打印数据、数据格式用户自定义
	va_end(ap);													//允许使用了 va_start 宏的带有可变参数的函数返回
	
	while((*pStr) != '\0')
	{
		delay_max =0;
		HAL_UART_Transmit(huart, (uint8_t *)pStr, 1, 0xFFFF);	
		while(__HAL_UART_GET_FLAG(huart,UART_FLAG_TC) != SET)			//等待发送完成
		{
			if(delay_max >0xFFF) break;
			delay_max++;
		}
		pStr++;					                                            //address data add
	}	
}

2、功能测试:

void test(void)
{

	uint8_t test_value[5];
	float test_float;
	
	test_value[0] = 'A';
	test_value[1] = 'b';
	test_value[2] = 88;
	test_float = 66.66;
	
	Debug_Printf(DEBUG_UART, "test  string		 \r\n");
	Debug_Printf(DEBUG_UART, "test   char: %c  \r\n",	test_value[0]);
	Debug_Printf(DEBUG_UART, "test   char: %c  \r\n",	test_value[1]);
	Debug_Printf(DEBUG_UART, "test    int: %d \r\n",	test_value[2]);
	Debug_Printf(DEBUG_UART, "test  float: %.2f \r\n",	test_float);

}

3、调试

 

在C语言中,我们可以使用自定义printf函数来输出格式化字符串。这个自定义printf函数可以接受任意数量的参数,并且可以根据用户提供的格式字符串来输出不同的内容。下面是一个示例代码: ```c #include <stdio.h> #include <stdarg.h> void my_printf(const char *format, ...) { va_list arg_list; va_start(arg_list, format); while (*format != '\0') { if (*format == '%') { format++; switch(*format) { case 'd': printf("%d", va_arg(arg_list, int)); break; case 'f': printf("%f", va_arg(arg_list, double)); break; case 's': printf("%s", va_arg(arg_list, char *)); break; default: printf("Unknown format specifier"); break; } } else { putchar(*format); } format++; } va_end(arg_list); } int main() { int i = 42; double d = 3.14; char *s = "Hello, world!"; my_printf("i = %d, d = %f, s = %s\n", i, d, s); return 0; } ``` 在上面的代码中,我们定义了一个名为my_printf的函数,它使用了可变参数列表和va_start、va_arg、va_end这三个宏。在函数中,我们遍历了格式字符串中的每一个字符,如果遇到了%字符,那么就根据下一个字符来判断应该输出哪种类型的参数,并且使用va_arg来获取参数的值。最后,我们使用printf来输出格式化的结果。 在主函数中,我们使用了自定义的my_printf函数来输出一些变量的值。当我们编译并运行这个程序时,我们会得到如下的输出: ``` i = 42, d = 3.140000, s = Hello, world! ``` 这个输出和使用标准的printf函数输出的结果是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值