uart 中斷 緩沖區(qū)
CVAVR程序向?qū)е薪o出的采用中斷+緩沖的方式接受數(shù)據(jù),同PC的串口接受數(shù)據(jù)的方法一樣,充分利用了AVR的高速和RAM多的優(yōu)點(diǎn),體現(xiàn)出了如何才能充分發(fā)揮AVR的特點(diǎn)的程序設(shè)計(jì)思想,這種思路在32位系統(tǒng)中也是這樣的。
使用AVR的話,對(duì)軟件的設(shè)計(jì)能力要求更高了,否則根本不能發(fā)揮和體現(xiàn)AVR的特點(diǎn)。許多人有了一點(diǎn)C的基礎(chǔ),就認(rèn)為采用C編寫單片機(jī)程序沒問題,很快就會(huì)掌握AVR了,對(duì)此我只能一笑了之??纯幢菊旧媳姸嗟拇a,再看看本貼的遭遇,能說什么呢?
回到本題:
注1:
如果在程序的開頭部分加上語句
#define
那么程序在編譯時(shí)仍使用系統(tǒng)自己的getchar()函數(shù),這樣在軟件模擬仿真時(shí),可以從模擬的終端讀取數(shù)據(jù),便于在軟件模擬環(huán)境中調(diào)試整個(gè)系統(tǒng),而需要正式運(yùn)行時(shí),則把該句注釋掉。
注2:
此處在正式應(yīng)用中應(yīng)根據(jù)實(shí)際情況做適當(dāng)?shù)男薷?。否則當(dāng)主程序調(diào)用getchar()時(shí),如果緩沖隊(duì)列中沒有數(shù)據(jù),同時(shí)對(duì)方也沒有發(fā)數(shù)據(jù)的情況時(shí),程序會(huì)在此死循環(huán)。
比較簡(jiǎn)單的辦法是將這句刪掉,而在調(diào)用getchar()函數(shù)前先判斷rx_counter的值,為0的話就不調(diào)用了。
或改為:
}
注3:
有興趣希望深入實(shí)在學(xué)習(xí)的網(wǎng)友,可將CVAVR生成的USART發(fā)送代碼仔細(xì)分析以下。它的發(fā)送代碼非常完美,可以馬上使用。
#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
}
思考分析:
我在主程序的循環(huán)里僅有一句不停的發(fā)0X55,問題是AVR的運(yùn)行速度非???,而USART串出的速度肯定明顯的慢(按9600bps計(jì)算,需要1秒多時(shí)間才能送出1000個(gè)字符),那么,假定主程序循環(huán)了1000次,發(fā)送1000個(gè)0x55,請(qǐng)判斷在UASRT口上能否正確的發(fā)出1000個(gè)0x55,有沒有丟失或溢出現(xiàn)象存在?
評(píng)論