各位大侠:
我想在单片机下实现串口打印功能的一个函数PrintfEx
但是要可以想printf一样格式化变量
如:
int a = 100;
PrintfEx("a is %d\r\n",a);
请问如何实现这一功能呢?谢谢!
先看看:va_arg, va_end, va_start这是如何从堆栈取变量,
然后:分析格式串‘%’,注意‘%%’
这个是上位机程序的事,单片机不可能格式化输出吧。。你用单片机发送数据,可以在上位机接受程序编程的时候把单片机发送来的数据实现格式化输出,就像在windows编程一样,跟下位机没关系。。
sprintf(buff,"%d%......",...);
char *p=buff;
while(*p!=0)
{
putcuart(*p);
p++;
}
LZ要实现“单片机下实现串口打印功能”!和上位机无关!
#include
#include
#include
#include
#include
void Uart_SendString(char *pt)
{
while(*pt)
PutUARTByte(*pt++);
}
void Uart_Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);
}
楼上:void Uart_Printf(char *fmt,...)中的…是什么意思啊?似乎见过,函数中还能这样传参?
void Uart_Printf(char *fmt,...)//表示不确定的参数个数,这种函数失去了编译器对类型的检查(类型在格式串中),不推荐使用。
5L的可以,再给个例子:(msdn)
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}