一直以来玩AVR都是将程序编译好直接下载到Flash,出现问题也是重新编写下载从来没有使用过仿真器之类的东东。前几天做串口的时候想到如何将串口通信数据直接显示在计算机上。因为我知道keil是可以的,可以直接使用printf函数将要显示的数据打印到串口(虚拟的 在keil里直接看到)那岂不是很爽。。。。
知道单片机中的存储器都非常金贵所以感到printf函数应该和标准C的不同,于是查阅了芯艺老师的教程(AVR与GCC)了解 马上敲了程序编译 结果不行!郁闷上网查了才知道我的编译器是20060421的,不兼容原来的程序 所以根据芯艺老师的指点修改了程序。 OK,编译通过 下载 。。。。结果还是没有:( 我的编译环境是avrstudio+winAVR) 难道AVRSTUDIO中没有观察串口显示的地方?这不可能吧!不过我费了好大劲还是没有找到?!哎 换个思路,既然AVRstudio中没有集成串口观察的地方,那也许是直接通过硬件串口输出呢?!马上连接好硬件,打开串口调试工具 上电 OK!
下面是程序,很简单 就是avr-libc的例程
- #include<avr/io.h> // 这一行是我自己增加的 呵呵没它不行啊
- #include<stdio.h>
- static int uart_putchar(char c, FILE *stream);
- static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);
- static int uart_putchar(char c, FILE *stream)
- {
- if (c == ’/n’)
- uart_putchar(’/r’, stream);
- loop_until_bit_is_set(UCSRA, UDRE);
- UDR = c;
- return 0;
- }
- int main(void)
- {
- init_uart();
- stdout = &mystdout;
- printf("Hello, world!/n");
- return 0;
- }
哦 还有一个串口的初始化程序 忘了贴了 补上
- init_uart(void)
- {
- UBRRL=25; // 4M晶体,9.6kpbs
- UCSRB|=(1<<TXEN);
- UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
- }