1、编译器不支持标准stdio.h即printf函数条件下,可自己实现printf函数;
2、实现方式如下:
#include "usart.h"
typedef char *va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(char) - 1) & ~(sizeof(char) - 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 )
//#define UartSendData(Data) do{while(_tidle != 0){_txr_rxr = *Data;}} while(0);
#define UartSendData(Data) do{while(_utidle == 0);_utxr_rxr = *Data;} while(0);
/**********************************************************************/
//Description: sky_itoa
//Parameters: ��int������תΪ2��8��10��16�����ַ���
//Return:
//Date:
//author: quanwu.xu
/**********************************************************************/
static char *sky_itoa(int value, char *str, unsigned int radix)
//static char *sky_itoa(long value, char *str, unsigned int radix)
{
const char list[] = "0123456789ABCDEF";
unsigned int tmp_value;
// unsigned long tmp_value;
int i = 0, j, k = 0;
if (NULL == str)
{
return NULL;
}
if (2 != radix && 8 != radix && 10 != radix && 16 != radix)
{
return NULL;
}
if (radix == 10 && value < 0)
{
//ʮ������Ϊ����
tmp_value = (unsigned int)(0 - value);
// tmp_value = (unsigned long)(0 - value);
str[i++] = '-';
k = 1;
}
else
{
tmp_value = (unsigned int)value;
// tmp_value = (unsigned long)value;
}
//����ת��Ϊ�ַ���������洢
do {
str[i ++] = list[tmp_value%radix];
tmp_value /= radix;
} while(tmp_value);
str[i] = '\0';
//�������ַ���ת��Ϊ����
char tmp;
for (j = k; j < (i+k)/2; j++)
{
tmp = str[j];
str[j] = str[i-j-1+k];
str[i-j-1+k] = tmp;
}
return str;
}
/**********************************************************************/
//Description: Printf
//Parameters:
//Return:
//Date:
//author: quanwu.xu
/**********************************************************************/
void printf(char * Data, ...)
{
const char *s;
int d;
char buf[16];
uint8 txdata;
va_list ap;
va_start(ap, Data);
while ( * Data != 0 )
{
if ( * Data == 0x5c )
{
switch ( *++Data )
{
case 'r':
txdata = 0x0d;
UartSendData((const char *)&txdata);
Data ++;
break;
case 'n':
txdata = 0x0a;
UartSendData((const char *)&txdata);
Data ++;
break;
default:
Data ++;
break;
}
}
else if ( * Data == '%')
{
switch ( *++Data )
{
case 's':
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
UartSendData((const char*)s);
}
Data++;
break;
case 'd':
d = va_arg(ap, int );
sky_itoa(d, buf, 10);
for (s = buf; *s; s++) {
UartSendData((const char*)s);
}
Data++;
break;
case 'x':
{
d = va_arg(ap, int);
sky_itoa(d, buf, 16);
for (s = buf; *s; s++)
{
UartSendData((const char*)s);
}
Data++;
break;
}
#ifdef PRINTF_FLAOT_TYPE
case 'f':
{
double num = va_arg(ap, double);
sky_ftoa(num, buf, 4);
for (s = buf; *s; s++)
{
UartSendData(s);
}
Data++;
break;
}
#endif
default:
Data++;
break;
}
}
else
{
UartSendData((const char*)Data);
Data++;
}
}
}