【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){
}

栈向下生长,先入后出。 

猜你喜欢

转载自blog.csdn.net/weixin_41865104/article/details/107112731