最近在朋友那学到了如何重定义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、调试