




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ZigBee模块协议栈-Z-Stack协议栈基础和数据传输实验花了好久写的.感觉还不错的呢.如果看,请细看.MuaZ-Stack协议栈基础和数据传输实验一、实验目的 终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来。串口优化把有线串口传输改为无线蓝牙传输。 二、实验平台硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块软件:实验基于SampleApp工程进行。 三、实验步骤1. 串口初始化代码2. 发送部分代码3. 接收部分代码 四、协议栈基础做实验之前先了
2、解一点关于协议栈的基础知识吧什么是协议栈?我们知道使用Zigbee一般都要进行组网、传输数据。可想而知其中的代码数量是非常庞大的,如果我们每次使用zigbee都需要自己写所以代码的话,会非常麻烦。因此就有了协议栈。可以说它是一个小型的操作系统,把很多通信、组网之类的代码都封装起来了。我们要做的只是通过调用函数来实现我们的目的。来看一下协议栈的工作流程图(图1)。然后我会对照流程图对协议栈进行简单的分析。 图1 我们就从流程图的“开始”开始分析吧打开工程文件SampleApp,main函数是程序执行的开始,我们要先找到它。Main函数在ZMAin文件夹的ZMain.c下,打开
3、它,找到main函数。 main();浏览一下main函数可以看到一开始都是各种初始化函数,即对应流程图中的“各种初始化函数”。初始化中我们需要注意的是“osal_init_system();”初始化操作系统函数。等一下会对它进行说明。继续看下去,“osal_start_system();”这是执行操作系统函数,对应流程中的“运行操作系统”。注意这个函数进去之后是不会再返回的。总结main函数就是初始化和执行操作系统两个部分。我们再来分析一下“osal_init_system();”这个函数,它的功能是初始化操作系统。我们go to definition看一下这个
4、函数的代码。 osal_init_system();浏览这个函数我们可以看到其中依旧是各种初始化函数。重点观察“osalInitTasks();”这个函数,函数功能是初始化任务系统,继续go to definition,查看该函数。 osalInitTask();通过注释我们可以知道这个函数也是拿来初始化的,可以里面的代码有点难以理解.这里我们需要先知道一点,后面会提到,这里先说明下。额,因为这个是我自己的理解,所以部分描述起来可能不是很专业,能懂这个意思就好了,以后专业起来了再回来修改.协议栈采用任务机制,然后使用轮询的方式处理任务。就是说在空闲的时候
5、它从优先级高的任务开始,一个个检查是否有任务要处理,有则处理这个任务,没有则继续循环检测。好嘞就是这样!那么再来看这个函数,它的作用就是按“任务”的优先级给它们发一个ID号,发的同时呢又对这个任务进行初始化。需要注意的是任务优先级越高,它的ID号越小!然后上面那些我们全都不用考虑,需要考虑的是最后两个函数(原来我们能操作的优先级最低呀.)。嗯.感觉go to definition好久了.就不继续看下去啦,之后再详细解读这两个函数吧这样子初始化的函数算是解释完了,我们回到main函数,继续看下一个函数“osal_start_system();”执行操作系统函数!来来来,继续g
6、o to definition找到它本尊。 osal_start_system();嗯哼,找到“osal_run_system();”我们继续. osal_run_system();这里就是我之前说的轮询的地方啦这里就说下我的理解吧.但是不确定对不对.大致思想应该是对的.先把工作分成两部分,一部分是任务请求,有任务请求了就把相应标志位置1。另一部分就是我们看到的这个函数。在函数开头读一下任务请求的寄存器(也许不是寄存器,就那个意思),然后从最高优先级依次检索是不是有任务请求。只要有任务请求,就进入处理任务请求部分(就是“if (idx
7、;< tasksCnt)”这个if语句里面的内容),没有则继续循环。处理任务请求部分中需要注意两点:1. 它在把高优先级任务处理完之后会继续检测是否还有任务请求,直到把使用任务请求处理完毕。2. 处理完一个任务之后它会清除该任务的标志位。咳,不知道你们有没有看懂.然后这里面的重点函数呢就是“events = (tasksArridx)( idx, events );”这一句。先看一看tasksArr这个数组的定义。 pTaskEventHandlerFn tasksArr有没有发现它和函数osalI
8、nitTasks();在同一个文件里面!有没有发现它就在osalInitTasks()这个函数的上面!再仔细看一看,有没有发现它定义成员变量名的顺序和下面初始化函数的顺序是一样的!这样说估计还是云里雾里的吧.(因为写到这里我也还是没有完全懂.)我再说明白点.之前不是说每个任务都有一个ID号嘛,优先级从0开始的,而数组里面第一位的索引号也是0,就是说任务ID号和数组索引号相对应,那么利用任务ID号就可以在数组里面找到相应的任务。还有很神奇的一点,至少我是怎么觉得的.之前看这行代码感觉非常难以理解.“events = (tasksArridx)( idx,
9、events ); ”。刚刚想明白的,原来那个数组的类型是一个函数!也就是说通过任务ID找到相应进行任务处理的函数!这样你们有没有明白?不懂留言.有人看吗?笑.终于,协议栈的分析工作完成了.会不会觉得很乱?看看下面的流程图再来回顾整理一下吧 图2 五、实验过程和说明1. 串口初始化代码在协议栈中,用户自己添加代码的地方基本为App这个文件夹。打开其中的文件SampleApp.c,在INCLUDES部分添加代码 #include "MT_UART.h" 图3操作说明:协议栈中关于串口封
10、装的文件有两个,一个是HAL->Target->CC2530EB->Drivers->hal_uart.c,另一个是MT->MT_UART.c。这两个文件有什么区别呢?打开文件研究一下。首先,在MT_UART.c中有include “hal_uart.h”,所以写头文件只要写”MT_UART.h”即可。然后,仔细看代码,分析hal_uart.c这个文件只要是对不同串口类型的相应操作进行选择,MT_UART.c这个文件则是对任意串口的操作。就是说MT_UART.c这个文件更底层一点。同样SampleApp.c文件中,找到函数void Sample
11、App_Init( uint8 task_id ),在其中加入串口初始化代码 /*串口初始化*/ MT_UartInit(); /串口初始化 MT_UartRegisterTaskID(task_id); /登记任务号 图4操作说明:串口初始化就不说了。登记任务号就是把串口事件通过task_id登记在SampleApp_Init();中。之前我们有提到说SampleApp_Init();函数很重要,就是分配ID号,它还是优先级最低的那个。把这个函数的ID号给串口就是告诉串口我是在这个函数里面初始化的,相应的我的任务优先级是最低的.更改串口初始化配置。在上
12、图所示的MT_UartInit();处go to definition,进入MT_UartInit()函数(如图5)。找到其中的MT_UART_DEFAULT_BAUDRATE,go to definition后将波特率设置为115200(如图6)。回到图3位置,找到MT_UART_DEFAULT_OVERFLOW,go to definition将参数设为FALSE(如图7)。 图5图6 图7操作说明:修改波特率就不解释啦。#define MT_UART_DEFAULT_OVERFLOW
13、160; FALSE这行代码是打开串口流控的意思。因为我们串口通讯是两根线的,必须把它关闭。 2. 发送部分代码打开SampleApp.c,找到SampleApp事件处理函数SampleApp_ProcessEvent()。补充一点,我们可以在SampleApp下添加自己的事件,每个事件有自己的事件号。事件号是16位的,但是每个事件号只允许占16位中的1位,也就是说最多有16个事件。我们先浏览一下代码,大致功能是分析传递进来的事件号,触发相应事件。感觉这个和任务号处理模式还是挺像的。我们需要关注的是“系统消息事件”被
14、触发之后。即 “if ( events & SYS_EVENT_MSG )”语句之后的部分。先看第一行:MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );这一行代码实现功能是获取系统消息数据。我们可以自己去查看里面的定义。afIncomingMSGPacket是包含整个消息内容的结构体类型。之后的选择语句则是根据消息中的信息对数据进行相应处理。我们需要关注如下代码(图8) 图8弄了半天,
15、原来还在初始化.意思是网络状态发送变化时(其实就是打开网络),就对数据发送进行初始化。看下这三个参数,第一个是任务号,不重复啦。第二个是事件号,这个也说过啦,每个事件只占1位哦!第三个是设置时间,就是规定你多久发一次信息!这里我们预设SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT = 5000,这个值可以自行修改,数值单位是毫秒,就是说这个程序是5秒发送一次数据。设置发送内容,自动周期性发送。在同一个函数下找到如下代码(图9) 图9如果触发周期性数据发送部分(就是说5秒过去了,要发送信息了),就执行SampleApp_SendPeriodi
16、cMessage()这个函数。这个函数是重点哦,里面放我们需要发送的数据。继续go to definition.找到该函数后对该函数做如下修改(如图10)。 图10我们来看一下AF_DataRequest()这个函数,通过上下文我们就可以知道这个函数一定就是决定发送数据内容的啦。我们需要关注的是其中第3、4、5个参数,第3个参数的作用是和接收方建立联系,这里定义SAMPLEAPP_PERIODIC_CLUSTERID=1,如果协调器收到一个数据包,获取里面的这个标号,为1则证明这个数据包是以周期性广播方式进来的。第4个参数表示发送数据的长度,第5个参数为需要发送的
17、数据的指针。进行到这里发送数据部分已经结束啦 3. 接收部分代码在SampleApp.c下找到函数“void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )”,在“case SAMPLEAPP_PERIODIC_CLUSTERID:”下面一行添加代码(如图11): HalUARTWrite(0, "I get data!n", 12); HalUARTWrite(0, &pkt->cmd.Data0, pkt->cmd.Data
18、Length); HalUARTWrite(0, "n", 1);图11 操作说明:我们先看一下这个条件语句“case SAMPLEAPP_PERIODIC_CLUSTERID:”。这个就是在发送部分设置的表示周期性发送数据的编号。看吧,这里就用上了在添加代码的这个地方,我们可以对收到的数据进行处理(不局限于串口发送)。这里的三行代码都是串口发送的,不再多说什么啦。重点看一下“afIncomingMSGPacket_t *pkt”。所有的数据和信息都在函数传进来的afIncomingMSGPacket里面,查看这个定义 afIncomingMSGPacket_t它是一个结构体,里面包含了数据包的所以内容,这里就不说啦,想知道的自己翻译下注释吧我们重点关注其中的afMSGCommandFormat_t cmd。查看它的定义 afMSGCommandFormat_t哦哦,这个里面就有我们传送的数据内容啦!其中的DataLength就是数据长度,Data就是数据内容的指针啦。我们再看
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中铁快运(郑州公司)招聘98人(河南)笔试参考题库附带答案详解
- 2025年上半年安徽池州东至县县直机关选调工作人员11人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽广播电视台传输发射序列(宿州市)招考人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽安庆潜山市事业单位招聘53人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽合肥市庐江县农委下属事业单位招考工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年安徽六新国投资控股集团限公司招聘10名易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年宁波市环境保护局局属事业单位招考2名紧缺人才易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年宁波工程学院招考非事业编制人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年宁德市古田县事业单位招聘工作人员73人重点基础提升(共500题)附带答案详解-1
- 2025华能澜沧江水电股份有限公司校园招聘笔试参考题库附带答案详解
- 成功八步课件
- 异物管控记录表
- 模具保养记录表
- 数字信号处理课后习题答案(吴镇扬)
- 蜂胶表彰会中宏全国通用版模板课件
- 消化系统疾病PBL教学案例
- DBJ∕T 15-104-2015 预拌砂浆混凝土及制品企业试验室管理规范
- 2022年HTD-8M同步带轮尺寸表
- 皮带滚筒数据标准
- 脚手架操作平台计算书
- 煤矿供电系统及供电安全讲座方案课件
评论
0/150
提交评论