借助T0定時(shí)器,不斷的計(jì)數(shù)+1 接收到一幀數(shù)據(jù)(1Byte)后,串口中斷服務(wù)函數(shù)將定時(shí)器T0計(jì)數(shù)清0(類似喂狗),并創(chuàng)建一個(gè)計(jì)數(shù)標(biāo)志 一幀數(shù)據(jù)(1Byte)長度約為1.04ms[9600bps,1,0,1]。當(dāng)串口中斷數(shù)據(jù)接收完畢后,短時(shí)間無有效數(shù)據(jù)接收并進(jìn)入中斷服務(wù)函數(shù),此時(shí)T0計(jì)數(shù)器不被清0,不斷累加 持續(xù)檢測(cè)到大于固定時(shí)間時(shí),認(rèn)為此刻一串?dāng)?shù)據(jù)已傳輸完畢。 固定時(shí)間間隔一般設(shè)置3-5倍的一幀數(shù)據(jù)長度(1.04ms)
UART中斷服務(wù)函數(shù)處理: 接收到一個(gè)字節(jié),打開T0計(jì)數(shù)軟件標(biāo)志,清一次計(jì)數(shù)器(計(jì)數(shù)器在T0定時(shí)器中一直在+1) - void uart_ISR() interrupt 4
- {
- if(RI)
- {
- RI = 0;
- timer_start = 1; //1. 接收到一幀數(shù)據(jù)時(shí),打開T0軟件計(jì)數(shù)器開始計(jì)數(shù)
- recv_buf[recv_Cnt] = SBUF;
- recv_Cnt++;
- if(recv_Cnt >= MAX_LENGTH) //超出開辟數(shù)組的保護(hù)處理,剩余掐斷
- {
- recv_Cnt = MAX_LENGTH;
- }
- ctimer_Cnt = 0; //3. 一幀數(shù)據(jù)接收完成后,將T0計(jì)數(shù)單元清0,類似喂狗。但T0一直累加
- }
- }
復(fù)制代碼
T0定時(shí)中斷服務(wù)函數(shù)處理:
接收到串口一個(gè)字節(jié)數(shù)據(jù)到達(dá)標(biāo)志,開始計(jì)數(shù)+1。判斷計(jì)數(shù)累計(jì)循環(huán)次數(shù),確定一串?dāng)?shù)據(jù)已發(fā)送完成
- void Timer0_ISR() interrupt 1
- {
- TR0 = 0; //進(jìn)T0中斷首先關(guān)閉定時(shí)器
- if(timer_start)
- {
- ctimer_Cnt++; //2. 接收到一幀數(shù)據(jù)后,定時(shí)時(shí)間計(jì)數(shù)單元開始計(jì)數(shù)
- if(ctimer_Cnt > MAX_RECV_TIME) //4. 一串?dāng)?shù)據(jù)接收完成后,下一幀無數(shù)據(jù),此時(shí)ctimer_Cnt一直被累加,
- { // 當(dāng)計(jì)時(shí)大于3ms,認(rèn)為一串?dāng)?shù)據(jù)已接收完成,將完成標(biāo)志置1
- ctimer_Cnt = 0;
- recv_flag = 1;
- cRealLen = recv_Cnt; //5. 一串?dāng)?shù)據(jù)傳輸完畢后,將實(shí)際長度輸出,生成數(shù)組recv_buf[],由主函數(shù)處理解析
- recv_Cnt = 0;
- }
- }
- TL0 = 0x66; //裝初值
- TH0 = 0xFC;
- TR0 = 1; //打開定時(shí)器T0
- }
復(fù)制代碼 |