标题:
mage128串口加超级终端打印程序。。
[打印本页]
作者:
hongniu
时间:
2015-6-24 21:21
标题:
mage128串口加超级终端打印程序。。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <avr/sfr_defs.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include<stdarg.h>
//使用的是mage128的板子,这个是抄别人的,觉得很好用,里面的可变参数的
//理解起来还是有点儿困难的,不过myprintf()这个函数很好用,如果电脑没有
//串口,也可以用usb转串口来实现,需要安装usb转串口驱动,硬件管理器里面可
//以看到安装后的usb-serial的com口,还有设置好波特率
//初始化串口
void init_uart(void)
{
//UART 初始化
UCSR1B=_BV(RXEN1)|_BV(TXEN1);/*(1<<RXCIE0)|(1<<TXCIE0)|*/
UBRR1L=103; //9600 baud 6MHz:38 4MHz:25 16MHZ:103
}
static int uart_putchar(char c)
{
if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSR1A, UDRE1);
UDR1 = c;
//mage128中有两个串口可以使用,这里使用了usart1,来发送数据,如果只有一个串口只要把寄存器中的1去掉就可以了,
//这个函数可以将数据发送给串口调试软件,也可以通过xp自带的超级终端来查看所以不一定非要下载串口调试软件,
//当然串口调试软件用起来功能多
return 0;
}
static int uart_getchar()
{
loop_until_bit_is_set(UCSR1A,RXC1);
return UDR1;
//mage128中有两个串口可以使用,这里使用了usart1,来发送数据,如果只有一个串口只要把寄存器中的1去掉就可以了,
//这个函数可以将数据发送给串口调试软件,也可以通过xp自带的超级终端
}
static void myprintf(const char* fmt,...)
{
const char* s;
int16_t d;
char buf[16];
va_list ap;
va_start(ap,fmt); // 将ap指向fmt(即可变参数的第一个?下一个?)
while (*fmt)
{
if (*fmt != '%')//如果不是%,则正常发送,这里不用for来发送所有非%字符的,原因是因为if语句里面有continue语句,//可以跳出循环执行下一个while循环,将所有的非%字符发送完毕,很牛逼,值得学习
{
uart_putchar(*fmt++); // 正常发送
continue; //发送完毕以后跳出继续下一个循环,这样就可以继续发送下一个字符
}
//由于上面的if以及continue的组合导致非%字符时程序不可能运行到这里,所以一旦运行到这里就说明*fmt++得到的是一个
//%字符
switch (*++fmt) //此时fmt先加一再取该地址处的数据原因在于上面是再得到了一个%以后才运行到此的,
//所以此时不需要理会%了,只要读出%后的字符就可以
{
case 's':
s = va_arg(ap,const char*); // 将ap指针指向的数据类型转换成char*型,并返回之,此时返回一个字符串的首地址
for (; *s; s++)
uart_putchar(*s);
break;
case 'x':
d = va_arg(ap,int); // 将ap指针指向的数据类型转换成int型,并返回之
itoa(d,buf,16); // 将整型d以16进制转到buf中
for (s = buf; *s; s++)
uart_putchar(*s);
break;
case 'd':
d = va_arg(ap,int);
itoa(d,buf,10); // 将整型d以10进制转到buf中
for (s = buf; *s; s++)
uart_putchar(*s);
break;
default:
uart_putchar(*fmt); //%号后面出现的非格式制定字符则按常理发送打印
break;
}
fmt++; //判断%号后面的字符以后,跳出switch语句,继续while循环,发送打印后面的字符
}
va_end(ap);
}
int main(void)
{
init_uart();// 初始化串口
uint8_t i = 100;
char * s = "Word!";
myprintf("\n\rHello %s\n\r0x%x = %d\n",s,i,i);
return 0;
}
复制代码
作者:
fsss007
时间:
2016-3-5 19:46
感谢分享,我有需要。
作者:
lihaokang
时间:
2016-7-26 14:54
谢谢楼主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1