第四部分 提高篇-第2章 协议栈无线收发控制LED

实验设备
硬件:PC 机一台;ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

2.1无线数据通信的一般步骤

在上一讲我们介绍了ZStack2.3的进行了剖析,本讲中我们介绍一个简单的实例–无线收发控制LED,让大家进一步了解协议栈的开发流程。

用户想要实现一个简单的无线数据通信时的一般步骤:
 组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。
 发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送。
 接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收。
看起来是不是很简单呢,是不是有动手试试的冲动。那就跟着编者一起进入一步一步做咯。

2.2无线数据通信的发送函数

首先,看看无线发送函数(在文件AF.h中):
这里写图片描述
用户调用该函数即可实现数据的无线数据的发送,此函数中有 8 个参数,用户需要将每个参数的含义理解以后,才能熟练使用该函数进行无线数据通信的目的。

第一个参数dstAddr(在文件AF.h中),该参数是一个结构体的指针。在该参数中除了指定了网络地址外,还需要指定目的地址的模式参数。
这里写图片描述
下面的是 afAddrMode_t结构体的定义(在文件AF.h中):
这里写图片描述
注意:ZigBee设备有两种类型的地址。一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16为网络地址是当设备加入网络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。
第二个参数endPointDesc_t *srcEP(在文件AF.h中),也是一个结构体的指针,源网络地址描述,每个终端都必须要有一个ZigBee的简单描述。
这里写图片描述
目标设备的简单描述结构
这里写图片描述
这里写图片描述
第三个参数uint16 cID为簇ID;
第四个参数len要发送的数据的长度
第五个参数uint8 *buf为指向发送数据缓冲的指针
第六个参数uint8 *transID为事务序列号指针,如果消息缓存发送,这个函数将增加这个数字;
第七个参数options为发送选项,可以由下面一项,或几项相或得到
AF_ACK_REQUEST 0x10要求APS应答,这是应用层的应答,只在直接发送(单播)时使用。
AF_DISCV_ROUTE 0x20总要包含这个选项
AF_SKIP_ROUTING 0x80设置这个选项将导致设备跳过路由而直接发送消息。终点设备将不向其父亲发送消息。在直接发送(单播)和广播消息时很好用。
第八个参数uint8 radius最大的跳数,用默认值AF_DEFAULT_RADIUS。

在上文中列出的所有参数供大家参考,现在主要关心下面两个参数,其它参数暂时不需在意,也不要可以去死记硬背,以后用多了自然就记住了。

uint16 len, / /发送数据的长度;
uint8 *buf, / /指向存放发送数据的缓冲区的指针。

对于无线收发函数这里就不列出来了,有兴趣的可以去看看,在AF.c里面,但是我还是建议初学者不要急于去分析函数具体是怎么实现的,初学阶段只需知道怎么用就行了,等你学到一定程度,再回头慢慢分析到底是怎么实现的。

2.3协议栈无线控制LED通讯实验

编者在上一讲已经对协议栈进行了深入剖析,相信很多初学习者都是云里雾里,并不是很明白,没关系,协议栈本身就是比较难的,大家只需知道协议栈的基本框架,基本概念,基本流程就够了,在以后的教程里编者将会带领大家继续深入学习。

2.3.1 协议栈无线控制LED通讯模型

好了,我们还是来看看协议栈到底是怎么开发的吧,我们以一个简单的实验开始 。先看看协议栈无线控制LED通讯模型吧。

这里写图片描述

图2-1协议栈无线控制LED通讯

2.3.2 Zigbee 工作流程

这里写图片描述

图2-2

看源码推荐大家使用 Source_Insight,十分强大的工具,如何安装在入门有相关的安装教程。对于从事软件行业,Source_Insight必备软件,除非你想做菜鸟,具体使用请参考《\ Source Insight 使用教程.pdf》。

下面列出实验中 涉及到比较重要的函数进行详解,在上一讲对一些函数也给出了分析,也是宏观上进行了讲解,在该次讲由于是带协议栈第一个实验,我们对源码也进行注释,方便习惯看源码的朋友学习。我建议大家先看看下面的文章,再阅读一次源码加深印象,后面的例子结构基本相同,所以学好此实验,再做后 面的实验就得心应手了。用户自己添加的应用任务程序在 Zstack 中的。

调用过程: main()—> osal_init_system()—> osalInitTasks()—> SampleApp_Init()

2.3.2.1主函数main相关

下面我们就先从 main()函数开始吧。
打开 ZMain.c 找到 main 函数
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
看了上面的代码后,可能感觉很多函数不认识。没关系刚开始大概了解流程即可,main 函数先执行初始化工作,包括硬件、网络层、任务等的初始化。然后执行 osal_start_system(); 操作系统。进去后可不会回来了。
在这里,我们重点了解2个函数:

 初始化操作系统 osal_init_system();
先来看osal_init_system();(OSAL.c文件里)系统初始化函数,进入函数。如果用 IAR 看代码可在函数名上单击右键 —go to definition of…,便可以进入函数。发现里面有6个初始化函数。
这里写图片描述
这里我们只关心 osal InitTasks();(OSAL_Tasks.c文件)任务初始化函数,继续由该函数进入。
这里写图片描述
这里写图片描述
 接下来看第二个函数 osal_start_system( ); (OSAL.c文件里)运行操作系统。同样用 go todefinition 的 方法进入该函数。
这里写图片描述
这里写图片描述
这里写图片描述
我们看一下 events = tasksEvents[idx]; 进入 tas ksEvents[idx]数 组定义,发现恰好是 osalInitTasks()函数里面分配空间初始化过的 tasksEven ts。而且 taskID 一一对应。这就 是初始化与调用的关系。taskID 把任务联系起来了。

2.3.2.2用户任务函数

 Sample App_Init()用户应用任务初始化函数
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
 Sample App_ProcessEvent() 用户应用任务的事件处理函数
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
 SampleApp_MessageMSGCB()接收数据函数
这里写图片描述
这里写图片描述

 SampleApp_SendPerio dicMessage()发送周期信息
这里写图片描述
这里写图片描述
看到最后,细心的朋友会发现,这讲讲的是LED怎么没看到与LED相关的定义呢,在这里编者给出他们的所在地(hal.board.cfg.h头文件里),解答你们困惑。
这里写图片描述
希望各位朋友不要把思维停留在裸机实验中,在协议栈部分需要有协议栈整个框架结构,在初学阶段不要再深究细节问题,不然你就出不来了,毕竟我们是站在巨人的肩膀上,整体架构,各种API函数前辈们已经写好了,我们只管用就行了,等你到达一定程度再看各个细节的处理吧。
好了,第一次就讲这么多吧,内容很多但非常重要,最好理解后再去做后面的实现,打好坚实的基础后,再去看后面的实验相对容易很多。

2.4实验现象

1)编译协议器的程序,在 Workspace 下拉框中选择“CoordinatorEB-Pro”,在工程名上点 右键选择”Rebuild All”,没错误提示再下载到开发板当中。

这里写图片描述

图2-3编译下载方法

2)编译终端设备的程序选择“EndDeviceEB-Pro”编译下载即可。
3)给两块开发板上电,通过观察 Led1 灯的变化,组网成功后两块开发板的D1 灯闪烁。
注意:工程路径为:
\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB\SampleApp
在以后的学习中,不特殊说明都打开此工程。

本章参考代码

点击进入

猜你喜欢

转载自blog.csdn.net/u013162035/article/details/80959589