这两天有空研究了下printf函数,参照网上资料自己写了个模拟printf函数,这样可以方便实现多串口printf了
其实printf函数最关键的就是可变参数的获取了,这里要用到stdarg.h库,经过测试基本没有问题了。
void myitoa(int data,char *buf )
{
int temp,j=0,i=0;
while(data) //反序生成数字,可自己取个数字测试,如123,反序字符数组中的值为321
{
buf[i++] = data%10+'0';//将转换后的数字字符存放在字符数组中
data = data/10; //删除已经转换的数字,为取下一个数字做好准备
}
buf[i--]='\0'; //转换完后还需要在字符数组后面加一个字符串结束标志'/0',代表是一个字符串
while( j < i ) //刚刚转换好的字符串是逆序的必须把它反转过来
{
temp = buf[j];
buf[j] = buf;
buf = temp;
i--,j++;
}
}
//------------------------COM3 printf------------------------------//
void DBGprintf(const char *format, ...)
{
va_list ap;
char c,nc;
va_start(ap, format); //从右到左将参数入栈,ap指向format
while (c = *format++)
{
if(c == '%'&&(nc = *format++) != '\0')
{
switch(nc)
{
case 'c': //输出1个字符
{
char ch = va_arg(ap, int); //调用后栈位置+1
DBG_SendASC(ch); //com3发送字符
break;
}
case 's': //输出字符串
{
char *p = va_arg(ap, char *);
DBG_SendStr((u8 *)p); //com3发送字符串
break;
}
case 'd':
{
int data = va_arg(ap,int);
char buf[16];
myitoa(data,buf);
DBG_SendStr((u8 *)buf);
break;
}
default:
DBG_SendASC(nc);
}
}else
{DBG_SendASC(c);}
}
va_end(ap); //关闭指针
}
|