【STM32】多个串口重定义实现printf输出

    技术2024-04-17  9

    目录

    工程代码:

    代码分析:


    如何实现多个串口重定义实现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){ }

    栈向下生长,先入后出。 

    Processed: 0.012, SQL: 9