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