您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 基于Z-Stack协议栈的抢答系统设计与实现
OHY研修笔记之“物联网应用技术”04Zigbee无线技术应用基础基于Z-Stack协议栈的抢答系统设计与实现欧浩源著广东职业技术学院2017年8月18日【引言】2017年全国职业院校技能大赛“物联网技术应用”赛项中任务三题2的“抢答器开发”是一个非常优秀的题目。本人对题目进行了适当的改造和完善,剔除了和技能大赛中特别设备高度相关的内容,使其成为一个通用的Zigbee无线组网技术应用入门学习的综合实训案例。不管是自我学习,还是专业教学,甚至是在技能大赛训练中,这个题目都适合使用。【硬件资源需求】要进行该“抢答系统”的实训案例,你需要5块具有无线数据通信能力的CC2530开发模块,其中一个板子有串口通信能力,另外的板子上至少有两个LED灯和1个按键,只要满足这些硬件资源即可开展该综合实训。本“抢答系统”实训案例中采用TI公司的2.5.1版Z-Stack协议栈,其在网络上随时随地都能下载到。在该版本Z-Stack协议栈的硬件驱动中支持了3个LED灯和1个按键,它们分别是:HAL_LED_1:P1_0(即D3)HAL_LED_2:P1_1(即D4)HAL_LED_3:P1_3(即D6)HAL_KEY_SW_6:P0_1(即SW2)注:括号中为全国职业院校技能大赛中新大陆国赛设备对应的资源根据“抢答系统”案例的需求,对上面的指示灯和按键做了相应的定义:HAL_LED_1:数据接收灯HAL_LED_2:抢答指示灯HAL_LED_3:网络状态灯HAL_KEY_SW_6:操作键在本“抢答系统”案例中只需要使用“数据接收灯”和“抢答指示灯”,“网络状态灯”被Z-Stack协议栈占用了,当无线组网成功后,该Zigbee开发板的这个灯会点亮,如果不亮,说明该Zigbee开发板组网失败。在进行本实训案例开发的时候,您使用的CC2530开发模块上的端口定义最好和这个版本协议栈原有的一致,不然可要进行底层的移植工作了。【项目应用需求】在为“抢答系统”准备好的5块基于CC2530的Zigbee无线组网开发板中,根据功能需求,分为以下三类设备:1块为显示节点,1块为主持人板,3块为抢答器板。显示节点通过串口连接到电脑,在电脑端有一个“抢答器信息显示终端”的上位机软件。该上位机软件是一个接收并显示“抢答系统”运行状态和抢答结果信息的软件。实际上,你可以根据本实训案例的通信规约自行设计一个合适的上位机显示软件。在没有该上位机软件的情况下也是可以进行“抢答系统”实训案例的开发的,你可以打开“串口助手”这种能过接收串口数据的小软件,监测系统传送过来的原始数据,然后对照系统的通信规约,从而判断“抢答系统”的运行状态和抢答结果。“抢答器信息显示终端”的参考界面如下:在“抢答系统”的无线网络数据传输中,数据流以帧的形式进行交互,并遵循一个简单的通信规约。1该数据帧有四个字节,其格式如下:帧头0xFA命令域参数域帧尾0xAF2主持人板复位指令:帧头0xFA0xA00x00帧尾0xAF3抢搭器板抢答指令:帧头0xFA0xB1抢答板ID号帧尾0xAF4主持人板确认指令:帧头0xFA0xA1抢答板ID号帧尾0xAF5串口波特率为:96006Zigbee的通道为:177Zigbee的PANID为:0x20178Zigbee通信方式:广播在协议栈“ZStack-CC2530-2.5.1a”中的适当的位置添加相应工程代码,实现抢答系统的如下功能:【步骤1】:所有的Zigbee开发板上电后,“抢答指示灯”闪烁3下,然后等待“网络状态灯”点亮,即全部Zigbee开发板组网成功,每个Zigbee开发版在成功接收到无数据帧的时候,“数据指示灯”快速闪烁2下。【步骤2】:单击主持人板的“操作键”时,主持人板及抢答器板的“抢答指示灯”均点亮,此时,显示节点的“抢答指示灯”熄灭,“抢答器信息显示终端”里显示“Ready!!!”,这时三个抢答器板可以开始抢答,在主持人板的“抢答指示灯”未亮之前,抢搭无效。【步骤3】:当主持人板及抢答器板的“抢答指示灯”点亮后,单击抢答器板中的“操作键”可进行问题抢答。当有人抢答成功后,主持人板及所有的抢答器板的“抢答指示灯”熄灭,显示节点上的“抢答指示灯”点亮,“抢答器信息显示终端”里显示“X号抢答成功!”。此时,3块抢答器板再次抢答无效。【步骤4】:重复步骤2、步骤3,完成下一题抢答。【项目设计概述】在我们下载的Z-Stack协议栈中有一个用户自定义任务SampleApp,本“抢答系统”案例将利用该协议栈的现有用户任务,将对其工程代码进行适当的添加和修改,以“抢答系统”的业务功能。抢答系统中的5块Zigbee开发板分为三种设备类型:显示节点、主持人板和抢答器板。因此,需要设计三个不同的工程代码。实际上,这个三个不同工程中的代码,绝大部分是相同的。你可以用三个协议栈工程来实现,你也可以用一个协议栈工程,通过三个不同的任务代码文件来实现,你还可以用条件编译来对三个设备类型,编译三种不同的工程代码。对应入门的初学者来说,建议使用第一种办法。在本案例分析过程中,介绍的是第二种方法。本抢答系统的设计关键在于,有一个系统的模型,有一个清晰的思路,有一个明确的方向,有一颗强大的内心。本项目案例的实现难点,不是设计程序,而是调试程序,而且还是多终端无线联调。要完成实现“抢答系统”要求的功能,除了要求掌握CC2530底层硬件基础和Z-Stack协议栈基础操作之外,还需要你不但有程序设计的能力,还要有代码调试的经验,不但能把代码跑起来,还能有锁定BUG的办法。【公共部分的代码设计】不要看这个抢答系统的步骤挺多的,实际上需要设计的代码量不是很大,但是,要完成这个案例需要有一个非常清晰的思路。因为开发人员要在Z-Stack协议栈的不同文件中添加和修改代码。你不但知道要添加和修改什么代码,而且还要知道在那个文件的什么位置今天添加和修改。在代码实现上,三类设备都有一些相同的功能。对于这一部分可以作为公共的代码来设计。如果采用第一中设计方法,该部分的代码编写完成后,则可以将该Z-Stack协议栈复制三份,分别进行显示节点、主持人板和抢答器板的程序开发。本文采用第二中方法,该部分代码编写完成后,再针对三类设备编写对应的功能代码,然后逐一编译即可。1设置通道和网络ID。在f8wConfig.cfg文件中,修改配置通道和PANID参数。2修改按键驱动代码。这个地方一般人不容易发现,我也是在调试中碰到问题,跟踪了大半天才发现的。不是说原来的Z-Stack协议栈代码有问题,而是TI提供的这个原版协议栈,其按键是高电平有效的,而我现在使用的Zigbee开发板是低电平有效的。在hal_key.c文件中,找到HalKeyPoll()函数,然后修改。3系统上电闪灯代码。HalLedBlink()函数非常有用,可以控制LED灯的打开、熄灭、反转和闪烁。具体应用在技术书籍和网络博文都讲得很清楚,自己可以去查阅。在本案例的实现中,我们有需要实现LED的点灯、灭灯和闪烁的应用。HalLedBlink()函数有4个参数:参数1----要控制的LED灯。参数2----闪烁次数,0为无限次。参数3----点亮占空比。参数4----闪烁周期,单位ms。点亮一个LED灯,让参数3为100即可。熄灭一个LED灯,让参数3为0即可。例如:HalLedBlink(HAL_LED_2,3,70,1000);,LED2灯闪烁3次,每次的周期为1000ms,其中点亮0.7秒,熄灭0.3秒。在SampleApp.c文件中,找到SampleApp_Init()函数,在任务初始化的时候,让“抢答指示灯”闪烁3下,以测试该灯是否处于正常工作状态。4全局变量的定义。在抢答系统中,要发送数据和接收数据,需要一个发送缓存,可以定义为4个uint8元素的数组,需要一个接收缓存,建议定义为uint8类型的指针。另外还定义两个布尔类型的标志,作为抢答器就绪和主持人获得抢答ID号的标志。在SampleApp.c文件中,定义程序运行过程中需要的全局变量。5定义数据输出簇。当Zigbee开发板接收到无线数据后,可以根据数据输出簇ID来判别该数据帧来自哪里,从而决定后续的处理。在本案例中,只有主持人板和抢答器板会输出无线数据,所以定义2个输出簇ID就可以了。在SampleApp.h文件中,添加输出簇ID并修改最大簇的数量。在SampleApp.c文件中,添加输出簇ID。6复制三个C源文件。找到任务SampleApp源文件所在的文件夹,将SampleApp.c文件复制三个,分别将其名字修改,作为显示节点、主持人板和抢答器板的源文件。【显示节点的代码设计】显示节点的主要功能是,接收RF无线数据,并将主持人板发来的数据通过串口上传给“抢答器信息显示终端”上位机软件,然后对数据帧进行分析,如果是抢答就绪,则熄灭“抢答指示灯”,如果是抢答成功,则点亮“抢答指示灯”。1替换工程代码文件。在IAR软件左边的工作区中,将Z-Stack协议栈原来的SampleApp.c源文件移除,然后将显示节点的源文件SampleApp-SHOW.c添加进来。2串口初始化和参数配置。在使用串口之前,要对其初始化和注册。在本案例中还需要修改串口的初始化函数,将其波特率改为9600,并禁止流控。首先,在MT_URAT.c文件中,找到MT_UartInit()函数,修改参数。串口的所有硬件参数都放在一个halUARTCfg_t类型的结构体里面,在里面找到波特率和流控属性对应的成员进行修改即可,其他的参数并不需要改动。如果你真的有需要修改其他参数成员的话,一定要先搞清楚它的含义。在SampleApp-SHOW.c文件中,找到SampleApp_Init()函数,初始化串口。3任务事件处理函数。所有的任务事件都在这里处理。当Zigbee开发板成功接收到一帧无线数据后,会产生一个AF_INCOMING_MSG_CMD事件,当开发板接收到一个按键触发后,会产生一个KEY_CHANGE事件。我们根据“抢答系统”的功能需求,自定义各类事件的处理函数,并在各自的事件中,执行事件对应的处理函数。在这里,我们首先处理无线数据接收的问题。先将Z-Stack协议栈原来的事件处理函数删除,然后自定义一个无线数据处理函数。在SampleApp-SHOW.c文件中,找到SampleApp_ProcessEvent()函数。4自定义无线数据处理函数。在SampleApp-SHOW.c文件中,声明自定义函数。在SampleApp-SHOW.c文件中,设计自定义函数。事件的自定义处理函数是“抢答系统”的功能需求处理核心,也是我们需要编写代码最多的地方。当显示节点成功接收到一帧数据之后,首先通过将“数据接收灯”闪烁2下,表示无线数据接收成功,然后进行具体的数据帧解析。在进行真正的数据解析之前,先通过无线数据输出簇ID号来判断该数据帧来自哪里。如果该数据帧来自抢答器板,则不做任何处理,直接退出该函数;如果该数据帧来自主持人板,则根据“抢答系统”的通信规约对数据帧里面的内容做进一步的分析和处理。如果命令域为0xA0,那么做抢答就绪的处理,如果命令域为0xA1,那么则进行抢答成功的处理。5编译下载程序。在整个“抢答系统”中,我们将显示节点将作为协调器,所以,在IAR软件左边工作区中选择“CoordinatorEB”这个工程配置。在下载程序之前,先对工程选项的预处理命令进行配置,其他的2个设备类型的文件亦是如此。【主持人板的代码设计】1替换工程代码文件。在IAR软件左边的工作区中,将Z-Stack协议栈原来的SampleApp-SHOW.c源文件移除,然后将显示节点的源文件SampleApp-HOST.c添加进来。2自定义无线数据处理函数。在处理来自抢搭板的无线数据帧之前,先判断FlagHostGetID标志的值,如果为FALSE,说明抢答系统处于就绪状态,抢搭板抢答有效。在这个情况下,将主持人板接收到的第一帧抢搭
本文标题:基于Z-Stack协议栈的抢答系统设计与实现
链接地址:https://www.777doc.com/doc-4512856 .html