stm32 在MDK环境下 可以多个串口用printf函数功能的写法

2019-12-12 18:19发布

本帖最后由 gagaguojia 于 2014-7-10 15:36 编辑

<一>首先,准备一下

写一个函数 比如       

#define unsigned char u8
////////////////////////////////////////////////////////////////////////////////////
//全局函数:     发送以ucBuffer指针为起始ulSize字节长度的串口数据
//函数名:          UsartNSendForN
//功能:            支持5个串口的USART发送
//形式参数:       u8 uartNum=串口号  u8 * ucBuffer=指针  int ulSize=字节长度
////////////////////////////////////////////////////////////////////////////////////
UsartNSendForN(u8 uartNum,u8 * ucBuffer, int ulSize)

这个函数在此省略,属于stm32的基本功了

<二> 小插曲 从标准函数中得到启示

//这是printf的原型
#include<stdio.h>  
#include<stdarg.h>  
int  printf(char const*__restrict fmt,...)  
{  
int ret;  
va_list ap;  
va_start(ap,fmt);  
ret=vfprintf(stdout,fmt,ap);  
va_end(ap);  
return(ret);  
}

这个函数就是把要输出的变量,发给了stdout 这个标准输出了
那我们可以仿照写一个函数,只是不输出给stdout ,咱们输出给一个指针,然后用<一>中的函数发出去(想用哪个串口就用哪个串口)就行了

<三> 上菜
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}

//u8 uartx 选择要用哪个串口发送
void MyPrintf(u8 uartx, const char*fmt,...)
{
         //在这里为指针创建个缓存空间,一般100字节就够了,根据个人需要,可以加大或者改小
           #define PRINTF_NUM  100
        int ret;
        char *pinh;
        char temp[PRINTF_NUM];//在这里我定义了100,那么用MyPrintf来输出,那么一次就不要超过100字节,如果超了,就改加大一下PRINTF_NUM
        va_list ap;
        pinh= temp;   
        va_start(ap,fmt);  
        ret=vsprintf(pinh,fmt,ap);//ret的值是要发送的总字节数 是int型 注意长度不要超过65535
        UsartNSendForN(uartx,(u8*)pinh,ret);  
        va_end(ap);  
}  

<四>可以应用了
        MyPrintf(1,"**very %d%c%d%s ",6,'D',3,"21443234");
显示结果:**very 6D321443234
        MyPrintf(2,"$$世界杯冠军  %c %s ",'0',"jfuiehguiyi");
显示结果:$$世界杯冠军  0 jfuiehguiyi
        MyPrintf(3,"**good %d%d%d ",8,0,2);
显示结果:**good 802


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。