单片机通信之接收一个完整数据包
程序员文章站
2024-03-18 08:50:34
...
本篇博文最后修改时间: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;
}
}
}
上一篇: C语言实现任意位置的参数默认值设置
下一篇: scapy模块分析数据包