avr单片机 串口实现printf(使用变参函数)
扫描二维码
随时随地手机看文章
#include
#include
#include
typedef unsigned char uint8;
static void usart_init(void)
{
UCSRA = 0x02;
UCSRB = 0x18;
UCSRC = 0x06;
UBRRH = 0x00;
UBRRL = 103;
}
static void put_char(uint8 data)
{
if (data == '/r')
put_char(0x09);
while ( !(UCSRA & (1<
;
UDR = data;
}
static void myprintf(const char* fmt,...)
{
const char* s;
int d;
char buf[16];
va_list ap;
va_start(ap,fmt); // 将ap指向fmt(即可变参数的第一个?下一个?)
while (*fmt)
{
if (*fmt != '%')
{
put_char(*fmt++); // 正常发送
continue;
}
switch (*++fmt) // next %
{
case 's':
s = va_arg(ap,const char*); // 将ap指向者转成char*型,并返回之
for (; *s; s++)
put_char(*s);
break;
case 'x':
d = va_arg(ap,int); // 将ap指向者转成int型,并返回之
itoa(d,buf,16); // 将整型d以16进制转到buf中
for (s = buf; *s; s++)
put_char(*s);
break;
case 'd':
d = va_arg(ap,int);
itoa(d,buf,10); // 将整型d以10进制转到buf中
for (s = buf; *s; s++)
put_char(*s);
break;
default:
put_char(*fmt);
break;
}
fmt++;
}
va_end(ap);
}
int main(void)
{
usart_init(); // 初始化串口
uint8 i = 100;
uint8* s = "Word!";
while(1)
{
myprintf("/n/rHello %s/n/r0x%x = %d/n",s,i,i);
}
return 0;
}