STM32多串口printf函數
1.hal庫
/*
USART1專用的printf函數
在usart.c中添加下列函數,還要添加申明頭文件#include<stdarg.h>,
#include <stdio.h>//支持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<stdarg.h>
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);
}