avr单片机 串口实现printf(使用变参函数) 下载本文

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; }