单片机通信之接收一个完整数据包

2019-04-15 18:46发布

本篇博文最后修改时间:2017年05月15日 14:27。     一、简介 本文以CC2541普通编程为例,介绍如何在CC2541中通信接收到有效数据。   二、实验平台   电脑平台:Windows7 64位旗舰 编译软件:IAR 硬件平台:CC2541   三、版权声明   博主:_懵懂 声明:此博客仅供参考不做任何商业用途,最终解释权归原博主所有。 原文地址:http://blog.csdn.NET/qq_18842031 懵懂之MCU交流群:136384801 项目合作开发地址:https://shop309207239.taobao.com/   四、实验前提 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 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; } } }