STM32多串口printf函数

STM32多串口printf函数
1.hal库

/*
USART1专用的printf函数
在usart.c中添加下列函数,还要添加申明头文件#include,
#include //支持printf函数
USART1_printf("abcd")用USART2发送字符abcd
*/
//hal库自定义串口printf函数
void printf2(char * fmt,...)
{
    char buffer[100];
    uint16_t i=0;
    va_list arg_ptr;
    va_start(arg_ptr,fmt);
    vsnprintf(buffer,100,fmt,arg_ptr);
    while(i<99&&buffer[i])
    {
        HAL_UART_Transmit(&huart1,(uint8_t *)&buffer[i],1,0xFFFF);
        i++;
    }
    va_end(arg_ptr);
}

2.固件库
1、申明头文件#include
2、buffer的大小根据需要调整,相应的循环条件也要改,此处可以定义成宏,方便调节buffer大小。
3、定义va_list变量,该变量是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。
4、va_start让arg_ptr指向printf函数可变参数里边的第一个参数;
5、vsnprintf()将按照fmt的格式将arg_ptr里的值依次转换成字符保存到buffer中,该函数有最大字符数限制,超过后会被截断,且该函数会自动在字符串末尾加‘\0’。
6、最后必须调用va_end(),由此确保堆栈的正确恢复。


void USART1_printf (char *fmt, ...){ 
	char buffer[USART1_REC_LEN+1];  // 数据长度
	u8 i = 0;	
	va_list arg_ptr;
	va_start(arg_ptr, fmt);  
	vsnprintf(buffer, USART1_REC_LEN+1, fmt, arg_ptr);
	while ((i < USART1_REC_LEN) && (i < strlen(buffer))){
        USART_SendData(USART1, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 
	}
	va_end(arg_ptr);
}

你可能感兴趣的:(stm32)