本帖最后由 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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
嗯,支持5个串口,格式都支持,和printf一样,支持各种格式
一周热门 更多>