關於單片機串口中斷接收幀包,此類東西網上一搜也是一大片,具體我就不在這里做過多的介紹了。
不過還是大概說下吧:所謂幀就是一串特定格式的數據,而數據當然是由字符構成的。
一般幀由 :幀頭、地址信息、數據類型、數據長度、數據塊、校驗碼、幀尾
邏輯協議解析的目的,首先判斷數據包的完整性,正確性,然后提取數據類型,數據等數據,存放起來用於主程序處理。
本文假設此數據為: 0x0C 0xAA 0xFA 0x55 0xFA data[...]... sum xor 0xf9
幀頭 Ox0C OxAA
源地址 0xFA
目的地址 0x55
數據長度 0xfa
校驗碼 sum xor
幀尾 0xf9
代碼如下:
1 unsigned char data_BUFF[]={0}; 2 unsigned char datacheck_OK = 0; //數據接收校驗標志位 3 unsigned char rc_datbuff; //數據 4 unsigned char lennum; //幀 數據長度 5 unsigned char length=0; // 幀數據包的主數據 標志 6 unsigned char sumchkm=0; //幀數據和校驗 7 unsigned char xorchkm=0; //幀數據的與或校驗 8 9 void RXBUFFINIT(){ 10 11 EA=1; 12 . 13 . 14 . 15 16 } 17 18 void main(){ 19 20 21 while(1){ 22 if(datacheck_OK == 0){ //校驗第一次包頭碼 23 if(rc_datbuff == 0x0C) 24 datacheck_OK = 1; 25 else datacheck_OK = 0; 26 } 27 esle if(datacheck_OK == 1){ //校驗第二次包頭碼 28 if(rc_datbuff == 0x0C) 29 datacheck_OK = 2; 30 else datacheck_OK = 0; 31 } 32 else if(datacheck_OK == 2){ 33 if(rc_datbuff == 0xFA){ //校驗源地址碼 34 sumchkm = rc_datbuff; //開始計算累加、異或校驗和 35 xorchkm = rc_datbuff; 36 datacheck_OK = 3; 37 } 38 else datacheck_OK =0; 39 } 40 else if(datacheck_OK == 3){ // 校驗目的地址碼 41 if(rc_datbuff == 0x55){ 42 sumchkm += rc_datbuff; //開始計算累加、異或校驗和 43 xorchkm ^= rc_datbuff; 44 datacheck_OK = 4; 45 } 46 else datacheck_OK =0; 47 } 48 else if(datacheck_OK == 4){ //數據長度 49 length = 0; //數據計數清零 50 lennum = rc_datbuff; //數據長度 51 sumchkm += rc_datbuff; 52 xorchkm ^= rc_datbuff; 53 datacheck_OK = 5; 54 } 55 else if(datacheck_OK == 5 || datacheck_OK == 6){ //數據接收&完成 56 data_BUFF[length++] = rc_datbuff; 57 sumchkm += rc_datbuff; 58 xorchkm ^= rc_datbuff; 59 if(length == lennum) datacheck_OK = 7; 60 else datacheck_OK = 6; 61 } 62 else if(datacheck_OK == 7){ 63 if(sumchkm == rc_datbuff ) datacheck_OK == 8; //校驗累加值與與或值是否相等 64 else datacheck_OK == 0; 65 } 66 else if(datacheck_OK == 8){ 67 if(xorchkm == rc_datbuff ) datacheck_OK == 9; //校驗累加值與與或值是否相等 68 else datacheck_OK == 0; 69 } 70 else if(datacheck_OK == 9){ //判斷幀尾 71 if(rc_datbuff == 0xf9) datacheck_OK == 0xff; //置為標志位 72 else datacheck_OK == 0; 73 } 74 75 } 76 } 77 78 79 80 void RX_BUFF(void) interrupt 0 using 1 { 81 82 . 83 . 84 . 85 rc_datbuff=BUFF; 86 87 }
datacheck_OK:為數據標志位,用於確定當前包在數據中的那個位置,並且接收過程中自動對接收數據進行校驗和處理,
在數據包接收完的同時也進行了校驗的比較。因此當幀尾結束符接收到的時候,則表示一幀數據已經接收完畢,並且通過了校驗,
關鍵數據也保存到了緩沖去中。