【STM32】多個串口重定義實現printf輸出

目錄

工程代碼:

代碼分析:


如何實現多個串口重定義實現printf輸出,在STM32中?

工程代碼:

#include "stdarg.h"		//包含需要的頭文件 

#define USART1_TXBUFF_SIZE   256    //定義串口3發送緩衝區大小 256字節

__align(8) char Usart3_TxBuff[USART1_TXBUFF_SIZE];//串口3緩存區

#if 1
//串口1
int fputc(int ch, FILE *s)
{
    /* 阻塞判斷串口是否發送完成 */
    while((USART1->ISR & 0X40) == 0);

    /* 串口發送完成,將該字符發送 */
    USART1->TDR = (uint8_t) ch;

    return ch;
}
#endif

//串口3,AT指令發送端口,操作wifi

void u3_printf(char* fmt,...) 
{  
	unsigned int i,length;
	
	va_list ap;
	
	//va_list 可變參數列表,存參數地址
	va_start(ap,fmt);//獲取可變參數地址 fmt地址賦給ap
	
	vsprintf(Usart3_TxBuff,fmt,ap);/*使用參數列表發送格式化輸出到字符串,
	函數功能將可變參數格式化輸出到一個字符數組
	*/
	//fmt中內容賦給Usart3_TxBuff,
	va_end(ap);	//清空參數列表
	//
	
	length=strlen((const char*)Usart3_TxBuff);		
	while((USART3->ISR&0X40)==0);
	for(i = 0;i < length;i ++)
	{			
		USART3->TDR = Usart3_TxBuff[i];
		while((USART3->ISR&0X40)==0);	
	}	
}

代碼分析:

可變參數:c語言可變參數輸出

        va_list ap;
	
	//va_list 可變參數列表,存參數地址
	va_start(ap,fmt);//獲取可變參數地址 fmt地址賦給ap
	
	vsprintf(Usart3_TxBuff,fmt,ap);/*使用參數列表發送格式化輸出到字符串,
	函數功能將可變參數格式化輸出到一個字符數組
	*/
	//fmt中內容賦給Usart3_TxBuff,
	va_end(ap);	//清空參數列表

把可變參數地址存到ap中,存儲圖如下。 

函數形式參數存儲:

void func(char * parameter0,char * parameter1,char * parameter2,char * parameter3){
}

棧向下生長,先入後出。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章