打印
[Zigbee]

协议栈无线收发控制LED

[复制链接]
812|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-8-5 13:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gwsan 于 2019-8-5 13:17 编辑

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

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

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


使用特权

评论回复

相关帖子

沙发
gwsan|  楼主 | 2019-8-5 13:17 | 只看该作者
2.2无线数据通信的发送函数

首先,看看无线发送函数(在文件AF.h中):

用户调用该函数即可实现数据的无线数据的发送,此函数中有 8 个参数,用户需要将每个参数的含义理解以后,才能熟练使用该函数进行无线数据通信的目的。


使用特权

评论回复
板凳
gwsan|  楼主 | 2019-8-5 13:18 | 只看该作者
第一个参数dstAddr(在文件AF.h中),该参数是一个结构体的指针。在该参数中除了指定了网络地址外,还需要指定目的地址的模式参数。

下面的是 afAddrMode_t结构体的定义(在文件AF.h中):


注意:ZigBee设备有两种类型的地址。一种是64位IEEE地址(物理),即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16为网络地址是当设备加入网络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。


使用特权

评论回复
地板
gwsan|  楼主 | 2019-8-5 13:18 | 只看该作者

*第二个参数endPointDesc_t srcEP(在文件AF.h中),也是一个结构体的指针,源网络地址描述,每个终端都必须要有一个ZigBee的简单描述。

目标设备的简单描述结构


使用特权

评论回复
5
gwsan|  楼主 | 2019-8-5 13:18 | 只看该作者
第三个参数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里面,但是我还是建议初学者不要急于去分析函数具体是怎么实现的,初学阶段只需知道怎么用就行了,等你学到一定程度,再回头慢慢分析到底是怎么实现的。

使用特权

评论回复
6
gwsan|  楼主 | 2019-8-5 13:19 | 只看该作者
2.3协议栈无线控制LED通讯实验
编者在上一讲已经对协议栈进行了深入剖析,相信很多初学习者都是云里雾里,并不是很明白,没关系,协议栈本身就是比较难的,大家只需知道协议栈的基本框架,基本概念,基本流程就够了,在以后的教程里编者将会带领大家继续深入学习。

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



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


使用特权

评论回复
7
gwsan|  楼主 | 2019-8-5 13:19 | 只看该作者
2.3.2 Zigbee 工作流程

图2-2

使用特权

评论回复
8
gwsan|  楼主 | 2019-8-5 13:19 | 只看该作者
看源码推荐大家使用 Source_Insight,十分强大的工具,如何安装在入门有相关的安装教程。对于从事软件行业,Source_Insight必备软件,除非你想做菜鸟,具体使用请参考《\ Source Insight 使用教程.pdf》。

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

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

使用特权

评论回复
9
gwsan|  楼主 | 2019-8-5 13:23 | 只看该作者
2.3.2.1主函数main相关
下面我们就先从 main()函数开始吧。
打开 ZMain.c 找到 main 函数






看了上面的代码后,可能感觉很多函数不认识。没关系刚开始大概了解流程即可,main 函数先执行初始化工作,包括硬件、网络层、任务等的初始化。然后执行 osal_start_system(); 操作系统。进去后可不会回来了。


使用特权

评论回复
10
gwsan|  楼主 | 2019-8-5 13:23 | 只看该作者
在这里,我们重点了解2个函数:

        初始化操作系统 osal_init_system();
先来看osal_init_system();(OSAL.c文件里)系统初始化函数,进入函数。如果用 IAR 看代码可在函数名上单击右键 —go to definition of…,便可以进入函数。发现里面有6个初始化函数。

这里我们只关心 osal InitTasks();(OSAL_Tasks.c文件)任务初始化函数,继续由该函数进入。



使用特权

评论回复
11
gwsan|  楼主 | 2019-8-5 13:24 | 只看该作者
        接下来看第二个函数 osal_start_system( ); (OSAL.c文件里)运行操作系统。同样用 go todefinition 的 方法进入该函数。



我们看一下 events = tasksEvents[idx]; 进入 tas ksEvents[idx]数 组定义,发现恰好是 osalInitTasks()函数里面分配空间初始化过的 tasksEven ts。而且 taskID 一一对应。这就 是初始化与调用的关系。taskID 把任务联系起来了。


使用特权

评论回复
12
gwsan|  楼主 | 2019-8-5 13:24 | 只看该作者
2.3.2.2用户任务函数

        Sample App_Init() 用户应用任务初始化函数







使用特权

评论回复
13
gwsan|  楼主 | 2019-8-5 13:24 | 只看该作者
        Sample App_ProcessEvent() 用户应用任务的事件处理函数







使用特权

评论回复
14
gwsan|  楼主 | 2019-8-5 13:25 | 只看该作者
*        SampleApp_MessageMSGCB()**接收数据函数


使用特权

评论回复
15
gwsan|  楼主 | 2019-8-5 13:25 | 只看该作者
**        SampleApp_SendPerio dicMessage()**发送周期信息


看到最后,细心的朋友会发现,这讲讲的是LED怎么没看到与LED相关的定义呢,在这里编者给出他们的所在地(hal.board.cfg.h头文件里),解答你们困惑。

希望各位朋友不要把思维停留在裸机实验中,在协议栈部分需要有协议栈整个框架结构,在初学阶段不要再深究细节问题,不然你就出不来了,毕竟我们是站在巨人的肩膀上,整体架构,各种API函数前辈们已经写好了,我们只管用就行了,等你到达一定程度再看各个细节的处理吧。

好了,第一次就讲这么多吧,内容很多但非常重要,最好理解后再去做后面的实现,打好坚实的基础后,再去看后面的实验相对容易很多。


使用特权

评论回复
16
gwsan|  楼主 | 2019-8-5 13:26 | 只看该作者
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在以后的学习中,不特殊说明都打开此工程。



使用特权

评论回复
17
phosphate| | 2019-8-6 14:40 | 只看该作者
感谢分享!学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3427

帖子

1

粉丝