本篇博文最後修改時間: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;
}
}
}