1. 程式人生 > >微控制器通訊之接收一個完整資料包

微控制器通訊之接收一個完整資料包

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