uart 中断 缓冲区
CVAVR程序向导中给出的采用中断+缓冲的方式接受数据,同PC的串口接受数据的方法一样,充分利用了AVR的高速和RAM多的优点,体现出了如何才能充分发挥AVR的特点的程序设计思想,这种思路在32位系统中也是这样的。
使用AVR的话,对软件的设计能力要求更高了,否则根本不能发挥和体现AVR的特点。许多人有了一点C的基础,就认为采用C编写单片机程序没问题,很快就会掌握AVR了,对此我只能一笑了之。看看本站上众多的代码,再看看本贴的遭遇,能说什么呢?
回到本题:
注1:
如果在程序的开头部分加上语句
#define
那么程序在编译时仍使用系统自己的getchar()函数,这样在软件模拟仿真时,可以从模拟的终端读取数据,便于在软件模拟环境中调试整个系统,而需要正式运行时,则把该句注释掉。
注2:
此处在正式应用中应根据实际情况做适当的修改。否则当主程序调用getchar()时,如果缓冲队列中没有数据,同时对方也没有发数据的情况时,程序会在此死循环。
比较简单的办法是将这句删掉,而在调用getchar()函数前先判断rx_counter的值,为0的话就不调用了。
或改为:
}
注3:
有兴趣希望深入实在学习的网友,可将CVAVR生成的USART发送代码仔细分析以下。它的发送代码非常完美,可以马上使用。
#include
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
//
#define
char
#if
unsigned
#else
unsigned
#endif
//
interrupt
{
if
}
#ifndef
//
#define
#pragma
void
{
while
#asm("cli")
if
else
#asm("sei")
}
#pragma
#endif
//
#include
//
void
{
//
//
//
//
//
PORTA=0x00;
DDRA=0x00;
//
//
//
PORTB=0x00;
DDRB=0x00;
//
//
//
PORTC=0x00;
DDRC=0x00;
//
//
//
PORTD=0x00;
DDRD=0x00;
//
//
//
//
//
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
//
//
//
//
//
//
//
//
//
//
//
//
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//
//
//
//
//
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
//
//
//
//
MCUCR=0x00;
MCUCSR=0x00;
//
TIMSK=0x00;
//
//
//
//
//
//
UCSRA=0x00;
UCSRB=0x48;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
//
//
//
ACSR=0x80;
SFIOR=0x00;
//
#asm("sei")
while
}
思考分析:
我在主程序的循环里仅有一句不停的发0X55,问题是AVR的运行速度非常快,而USART串出的速度肯定明显的慢(按9600bps计算,需要1秒多时间才能送出1000个字符),那么,假定主程序循环了1000次,发送1000个0x55,请判断在UASRT口上能否正确的发出1000个0x55,有没有丢失或溢出现象存在?
评论