關於單片機MCU 幀數據(包數據)的數據包的事例


關於單片機串口中斷接收幀包,此類東西網上一搜也是一大片,具體我就不在這里做過多的介紹了。

不過還是大概說下吧:所謂幀就是一串特定格式的數據,而數據當然是由字符構成的。

一般幀由 :幀頭、地址信息、數據類型、數據長度、數據塊、校驗碼、幀尾

邏輯協議解析的目的,首先判斷數據包的完整性,正確性,然后提取數據類型,數據等數據,存放起來用於主程序處理。

本文假設此數據為: 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:為數據標志位,用於確定當前包在數據中的那個位置,並且接收過程中自動對接收數據進行校驗和處理,

在數據包接收完的同時也進行了校驗的比較。因此當幀尾結束符接收到的時候,則表示一幀數據已經接收完畢,並且通過了校驗,

關鍵數據也保存到了緩沖去中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM