STM32
直播中

李军

7年用户 1237经验值
私信 关注
[问答]

在STM32中如何去实现多个串口重定义printf输出呢

STM32中如何去实现多个串口重定义printf输出呢?

回帖(1)

符筹荣

2021-12-1 11:21:03
工程代码:

#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;
                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){
}
栈向下生长,先入后出。


举报

更多回帖

×
20
完善资料,
赚取积分