我是靠谱客的博主 炙热牛排,最近开发中收集的这篇文章主要介绍单片机通信之接收一个完整数据包,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本篇博文最后修改时间: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; 
    }
  }
}

 

最后

以上就是炙热牛排为你收集整理的单片机通信之接收一个完整数据包的全部内容,希望文章能够帮你解决单片机通信之接收一个完整数据包所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部