STM32多串口printf函數

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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章