單片機通信之接收一個完整數據包

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章