1. 程式人生 > >51微控制器串列埠通訊的幀資料接收

51微控制器串列埠通訊的幀資料接收


首先定義一個數據幀格式,Header :{ 0xAA 0x55} type:{ 0x01 | 0x02 | 0x03 } length:{  N } body :{____n個位元組的資料___ }

資料的格式就是上面的定義  Header 為幀頭 標記一個數據幀的開始,type 為型別 用來識別資料的型別 ,Length為長度標記 用來識別是否收完一幀的資料;

這次的目的是為了獲取來自PC端串列埠傳來的漢字字模資料 —— 一條長為32位元組的資料,所以定義N = 32;型別 因為是第一個要用到的資料就先使用type=0x01

現在確定的格式 一幀資料 大概是  

unsinged char code test[36]={0xaa,0x55,0x01,0x20,0x01,0x0D,0x1D,0x19,0x01,0x3F,0x3F,0x03,0x03,0x03,0x07,0x26,0x6E,0x7C,0x38,0x00,0x98,
					0x98,0x98,0x8C,0x8C,0x8E,0xEF,0xED,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x00};

當一個數據發來微控制器進入中斷程式開始接收資料

void mReceive(){
	uart_flag =0;//接收標誌
<span style="white-space:pre">	</span>RI=0;//手動清暫存器
<span style="white-space:pre">	</span>receive[count]=SBUF;
	if(count==0&&receive[count]==0xaa){
		count=1;
	}
	else if(count==1&&receive[count]==0x55){
			count=2;
	}	
	else if(count>=2){
		if(count-3==receive[3]){ //當已經接收到的長度是該資料幀的長度時接收完成
			count=0;
<span style="white-space:pre">			</span>uart_flag=1;
		}else if (count>=37)//超長驗證,如果資料接收一幀的長度還沒有完成驗證一整幀則接受失敗 開始新的接收
		{
			count  = 0;
		}else{
                       count+=1;
                     }
	else {
		count=0;
	}	
}

第一張是LabView上的模擬顯示第二張是proteus模擬接收到的資料然後顯示的結果