微控制器通訊之接收一個完整資料包
阿新 • • 發佈:2019-02-12
本篇博文最後修改時間:2017年05月15日 14:27。
一、簡介
本文以CC2541普通程式設計為例,介紹如何在CC2541中通訊接收到有效資料。
二、實驗平臺
電腦平臺:Windows7 64位旗艦
編譯軟體:IAR
硬體平臺:CC2541
博主:_懵懂
宣告:此部落格僅供參考不做任何商業用途,最終解釋權歸原博主所有。
原文地址:http://blog.csdn.NET/qq_18842031
懵懂之MCU交流群:136384801
四、實驗前提
1、在進行本文步驟前,請先安裝IAR 版本8.10.4;準備好CC2541硬體平臺。
五、基礎知識
暫無
六、實驗內容
1、根據幀頭幀尾檢測一個數據幀
1).幀頭+資料+校驗+幀尾
這是一個典型的資料接收方案,但是需要注意幀頭幀尾的設計,意思是幀頭幀尾不能出現與傳輸的資料內容相同,一旦出現可能會被誤判。以下為中斷接收的基本程式:
unsigned char flagpacker; //全域性變數 是否完整接收一個數據包 unsigned char Rxpacker[255]; //全域性變數 完整資料包 #pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void) { unsigned char RxBuf; //臨時接收 static unsigned char RxData[255]//接收資料快取區 static unsigned char count; //串列埠接收資料長度 static unsigned char rec; // 判斷是否正在接收資料 URX0IF = 0; // 清中斷標誌 RxBuf = U0DBUF; if(RxBuf == (自定義幀頭)) { rec= 1; count = 0; flagpacker = 0; return ; } if(RxBuf == (自定義幀尾)) { rec= 0; //此處可以新增校驗碼 for(unsigned char i = 0 ; i <count; i + +) { Rxpacker[i] =RxData[i]; } flagpacker = 1;//告訴系統已接收一個完整的資料包 return ; } if(rec) //判斷是否處於接收狀態 { RxData[count++] = RxBuf; } }
2、根據幀頭資料長度檢測一個數據幀
1).幀頭+資料長度+資料+校驗
這也是一個典型的資料接收方案,但是需要注意幀頭的設計,意思是幀頭不能出現與傳輸的資料內容相同,一旦出現可能會被誤判。以下為中斷接收的基本程式:
unsigned char flagpacker; //全域性變數 是否完整接收一個數據包 unsigned char Rxpacker[255]; //全域性變數 完整資料包 #pragma vector = URX0_VECTOR __interrupt void UART0_ISR(void) { unsigned char RxBuf; //臨時接收 static unsigned char len; //判斷有效資料長度 static unsigned char RxData[255]//接收資料快取區 static unsigned char count; //串列埠接收資料長度 static unsigned char rec; // 判斷是否正在接收資料 URX0IF = 0; // 清中斷標誌 RxBuf = U0DBUF; if(RxBuf == (自定義幀頭)) { rec = 1; count = 0; flagpacker = 0; return ; } if(rec) { RxData[count++] = RxBuf ; len = RxData[0] + 1; //判斷資料長度 如果包含資料長度位就不用加1 否者需要加1 if(len == count) { //此處可以新增校驗碼 for(unsigned char i = 0 ; i < count; i ++) { Rxpacker[i] = RxData[i]; } rec = 0; flagpacker = 1; } } }