通信实训Jennic-WSN

更新时间:2023-07-24 08:59:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

实验一 Jennic-WSN开发环境 ............................................................... 1

实验二 GPIO及LCD使用实验 ............................................................... 4

实验三 简单点对点无线通信实验 ........................................................ 8

实验四 两个EndDevice之间的无线通信实验 .................................. 13

实验五 DIO中断实验 ........................................................................... 21

实验六 定时器实验 .............................................................................. 25

实验七 UART实验 ................................................................................. 29

实验八 ADC及数据采集实验 ............................................................... 34

实验九 休眠和掉电保护实验 .............................................................. 40

心得体会 ................................................................................................... 47

实验一 Jennic-WSN开发环境

一、实验内容

1. 熟悉基于JN5139芯片所设计的WSN开发板及其部件。

2. 软件的安装于调试。

3.熟悉常用API接口函数。

二、实验原理

1. 基于JN5139芯片所设计的WSN开发板,其部件如下:

U1: JN5139系列Zigbee模块;

U2: 板载光照度传感器;

U3: 板载温湿度一体传感器;

J3: 外供电(5VDC)接口;

Swith: 供电开关;

J7: 编程与运行状态选择,左跳并给传感器板加电,则进入可编程状态,或者在加电的

情况下,按住RESET按钮,左跳J7,然后放开RESET按钮,再右跳J7,也可进入可编程状态,退出可编程状态,只需要按一下RESET按钮即可;

J8: Flash写保护跳选,编程与运行都跳选到RUN(右跳);

DB9: RS232编程接口;

UART0: 串口0;

JP6: 模块所有管脚的引出排线(引脚编号如图1-4所示,功能如表1-1所示);

LCD: 液晶接口;

Power: 电源指示灯;

REST: 复位按键;

LED3,LED2,LED1,LED0:可编程LED,分别对应DIO19、DIO18、DIO17、DIO16;

SW3,SW2,SW1,SW0:可编程按键,分别对应DIO20、DIO11、DIO10、DIO9;

GND: 地。

2. 软件的安装与调试

(1)建立开发环境

在光盘中找到software文件夹下的JN-SW-4031-SDK-Toolchain-v1.1.exe文件(或者在Jennic公司网站上获得该文件)并运行。在安装过程中,最简单的方法是按默认设置安装。

(2)编写程序代码并进行下载与调试

编写代码完成后,可按Ctrl+F9快捷键或选择主菜单Build下的Build子菜单或点击图标建立可执行二进制代码文件。

若工程编译(Build)成功,则可在C:\Jennic\cygwin\jennic\SDK\Application\test\JN5139_ Build\Release目录下生成test.bin文件。否则,出错信息会显示在信息窗口中,根据出错信息调试程序。

Jennic JN51xx Flash可编程器是用来将编译好的二进制代码文件(*.bin)下载到JN51xx

模块中的Flash芯片的代码下载工具,它通过串行总线与JN51xx模块相连。

Jennic JN51xx Flash可编程器的用户界面如图1-18所示,它可以将* .bin文件下载到目标板或模块中,下载步骤如下:

① 用串口线连接PC机和目标板或模块。

②运行Flash可编程器,选择PC机与目标板相连的串行通讯端口。

③ 将目标板上的J7跳线至编程(左侧)状态,给目标板上电,按一下RESET按钮后释放,再恢复J7跳线至右侧。

④ 在图1-18所示的Flash可编程界面上点击Browse按钮(图中①处)查找并选择要下载的目标文件。

⑤ 选择好目标文件后,点击Progrm按钮(图中②处)开始下载。在下载的过程中会显示一个下载的进度条,如图1-19所示。当下载完成后,将显示下载成功或错误,如图1-20所示下载成功对话框。如果遇到错误,请尝试重新下载。

⑥ 成功下载后,关掉Flash可编程器再给目标板或模块上电、或按Reset按钮,则刚下载的代码自动运行。

(3)常用API接口函数介绍

应用程序初始化函数如下:

AppColdStart( )

应用程序的入口,相当于标准C中的main函数,结点上电后将从这里开始执行应用程序。该函数需要完成以下功能:1. 通过设置函数中的参数值来设置信道号(JZS_sConfig.u32Channel)和PAN ID(JZS_sConfig.u16PanId); 2. 调用函数JZS_u32InitSystem(TRUE)来初始化ZigBee 协议栈;3. 调用函数vInit( )对用户的应用进程进行初始化,包括初始化按钮动作和程序变量,设定绑定等操作;4. 调用bBosRun(TRUE)来启动操作系统BOS。用户可根据具体的应用设计该函数。

AppWarmStart( )

结点从内存供电的休眠模式唤醒的时候将进入这个函数。启动后所有的内存数据都没有丢失。如果设备不需要休眠唤醒功能,这个函数可以为空。用户可根据具体的应用设计该函数。一般情况下,该函数会调用AppColdStart( )重新启动设备。

应用程序调用协议栈的函数如下:

JZS_u32InitSystem( )

初始化Jennic ZigBee协议栈。

JZS_vStartStack ( )

设备将作为Coordinator、Router或者End Device启动。如果是Coordinator将启动网络,如果是Router或者End Device将加入网络。

JZS_vStartNetwork ( )

手动控制Coordinate网络启动,相对于自动网络启动,使用该功能,需要设置JZS_sConfig.bAutoJoin=FALSE.该函数执行后,返回的协议栈事件为JZS_EVENT_NWK_STARTED JZS_EVENT_FAILED_TO_START_NETWORK 。

vAppSaveContexts ( )

保存网络参数以及用户的数据,如果你的应用是固定点的话,建议你进行网络参数的保存。

u16AppGetContextSize ( )

用来获取保存的网络参数以及用户数据的尺寸。

vAppGetContexts ( )

读取保存的网络参数的内容。

协议栈调用应用函数的函数如下:

JZA_boAppStart( )

让用户可以在协议栈启动前定义endpoint的descriptor,通常开发人员应该在这个函数中调用JZS_vStartStack启动协议栈。

JZA_vStartEvent( )

协议栈将通过这个函数反馈网络层的一些网络事件,比如网络启动成功、结点加入成功或者数据发送完成等。

JZA_vPeripheralEvent( )

该函数主要用来处理外部的硬件中断,比如按钮、定时器、UART等。

JZA_vAppEventHandler( )

BOS周期性地调用该函数处理硬件中断。用户可以利用它进行网络状态的判断和按钮的检查等,也可以在这个函数中,写入自己的应用程序。在设计该函数时,要尽可能地使其运行时间短,以便BOS调度其他活动事件。

JZA_vAppDefineTasks( )

该函数用于向BOS注册自己的用户任务,一般很少使用该函数。

JZA_bAfMsgObject( )

收到其他结点发送来的MSG帧的处理函数。

通信新技术综合训练报告

实验二 GPIO及LCD使用实验

一、实验内容

1. 运用基本GPIO函数设计一个程序,分别通过各按键切换对应LED亮/灭状态。

2. 设计一个程序,实现LED自动闪烁,周期1秒。

3. 设计一个程序,按下按键SW0,LCD显示数据加1;按下按键SW1,LCD显示数据减1。

二、实验原理

1. AppColdStart( )

作用:应用程序的入口,相当于标准C中的main函数,结点上电后将从这里开始执行应用程序。该函数需要完成以下功能:a.通过设置函数中的参数值来设置信道号(JZS_sConfig.u32Channel)和PAN ID(JZS_sConfig.u16PanId); b.调用初始化子程序。

2. AppWarmStart( )

作用:该函数会调用AppColdStart( )重新启动设备。

3. JZS_vStartStack ( )

作用:启动网络,设备作为Coordinator启动。

4. JZA_vAppEventHandler( )

作用:BOS周期性地调用该函数处理硬件中断。进行网络状态的判断和按钮的检查。检查若有按键,则调用按键程序。

5. 按键子程序vProcessSplashKeyPress( )

作用:通过调用该程序,对按键进行处理,利用case语句:按键0,LED0亮灭;按键1,LED1亮灭;按键2,LED2亮灭;按键3,LED3亮灭。

6. vInit()

作用:a.初始化LED和按键; b. 调用函数JZS_u32InitSystem(TRUE)来初始化ZigBee 协议栈; c. 调用bBosRun(TRUE)来启动操作系统BOS。

三、软件设计

1. 运用基本GPIO函数设计一个程序,分别通过各按键切换对应LED亮/灭状态。

(1)流程图:

(2)工作过程:

①执行AppColdStart( )函数,设置信道号和PAN ID;

②调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;

③调用JZS_vStartStack ( )函数,启动网络,启动成功后,灭灯0;

④调用JZA_vAppEventHandler( )函数(BOS时钟周期性调用函数),如果网络启动成功,则读取按键值,若有键按下,则将按键允许标志去掉,然后调用按键子程序,最后周期性调用vAppTick()函数,用于按键消抖;

⑤调用按键子程序vProcessSplashKeyPress( ),执行按键指令,控制相应LED灯亮灭,以达到设计要求。

2. 实现LED自动闪烁,周期1秒。

(1)流程图:

(2)工作过程:

①执行AppColdStart( )函数,设置信道号和PAN ID;

②调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;

③调用JZS_vStartStack ( )函数,启动网络,启动成功后,灭灯0;

④调用JZA_vAppEventHandler( )函数(BOS时钟周期性调用函数),如果网络启动成功,则用bBosCreateTimer()函数周期性调用vAppTick()函数,周期为1s;

⑤调用vAppTick()函数,定义一个标志位变量LED,LED从0~2循环变化,利用vLedControl(LED,TRUE),并且在函数结尾再自己调用自己,使LED灯实现周期性闪烁。

3.按下按键SW0,LCD显示数据加1;按下按键SW1,LCD显示数据减1。

(1)流程图:

(2)工作过程:

①执行AppColdStart( )函数,设置信道号和PAN ID;

②调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;

③调用JZS_vStartStack ( )函数,启动网络。

④调用JZA_vAppEventHandler( )函数(BOS时钟周期性调用函数),如果网络启动成功,则读取按键值,接下来调用vLcdShadowClear()函数清除影子内存,display(shu, SIZE,2)函数写影子内存vLcdRefresh()函数液晶显示,若有键按下,则将按键允许标志去掉,然后调用按键子程序,最后周期性调用vAppTick()函数,用于按键消抖;

⑤调用按键子程序vProcessSplashKeyPress( ),执行case语句:按键0,调用jia() 函数,对液晶显示的数进行加1;按键1,调用jian() 函数,对液晶显示的数进行减1;

四、实验结果与分析

1. SW0~SW3分别控制LED0~LED3,按下对应的键,就能使对应的灯改变当前状态,如果亮的就灭,如果灭的就亮,符合设计要求。

2. 网络启动成功(LED0灭)后,LED灯从0~3以周期1秒的速度自动闪烁,符合设计要求。

3. 网络启动成功后,液晶上显示初始数据“0001”,此时按下按键SW0,LCD显示数据加1;按下按键SW1,LCD显示数据减1。符合设计要求。

五、存在问题和解决方法

1. 在做第二个设计的时候,发现自动从0~3自动闪烁不能实现。

解决方法:在周期性调用的vAppTick()函数中,在将LED赋值后还要调用函数自身,这也才能达到此函数不停的执行,LED灯自动闪烁。

2. 第三个设计中,数据不能正常显示,显示的是一些乱码。

解决方法:将4位数据转换成四个字符显示,这样就可以正常显示了。

通信新技术综合训练报告

实验三 简单点对点无线通信实验

一、实验内容

1. 分别为Coordinator和EndDevice设计一个程序,分别用按键控制切换对方对应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。

2. 分别为Coordinator和EndDevice设计一个程序,其功能为:按下Coordinator的SW0,某变量X(初始值0)显示在LCD上,同时将X发送给EndDevice,EndDevice收到该数据后进行数据处理(加1),等待1秒后再将其发送给Coordinator,Coordinator收到后将该值赋予X并显示在LCD上,同时再次发送给EndDevice,如此重复运行。

二、实验原理

1. 创建和发送数据请求函数afdeDataRequest( )

该函数属于AFDE(AF Sub-layer Data Entity) 类函数,用来向网络层发出数据发送的请求。

2. 收到MsgObject调用的函数JZA_bAfMsgObject ( )

该函数属于协议栈调用应用程序的函数,用来处理来自其他结点发送来的MSG帧。在程序设计中可对接收到的数据进行处理,也可根据接收的指令进行操作。

3. 简单设备描述函数afmeAddSimpleDesc( )

该函数属于AFME(AF Sub-layer Management Entity) 类函数,在增加设备描述符函数vAddDesc(void)中调用,其功能是为一个endpoint增加一个简单描述符(simple descriptor)。如果一个endpoint上没有正确定义的简单描述符,那么它将不能正确地接收来自其他结点的数据,通常简单描述符应该在设备建立网络成功或者加入网络成功后添加。

三、软件设计

1. 分别为Coordinator和EndDevice设计一个程序,分别用按键控制切换对方对应LED亮/灭状态。如Coordinator的SW3控制EndDevice的LED3,EndDevice的SW0控制Coordinator的LED0。

(1)流程图:

Coordinator:

Enddevice:

(2)工作过程:

Coordinator:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,启动网络,启动后,灭灯0,若有新结点加入,灭灯1;判断是否SW3被按下,若按下了则调用vSendData()函数向enddevice发送一个数据2;在程序运行过程中若接收到MSG信息,则调用vLedControl(0,bToggle)控制coord的灯0亮灭 。

Enddevice:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,加入网络,加入成功后,灭灯0;判断是否SW0被按下,若按下了则调用vSendData()函数向coordinator发送一个数据2;在程序运行过程中若接收到MSG信息,则调用vLedControl(3,bToggle)控制enddevice的灯3亮灭 。

2. 分别为Coordinator和EndDevice设计一个程序,其功能为:按下Coordinator的SW0,某变量X(初始值0)显示在LCD上,同时将X发送给EndDevice,EndDevice收到该数据后进行数据处理(加1),等待1秒后再将其发送给Coordinator,Coordinator收到后将该值赋予X并显示在LCD上,同时再次发送给EndDevice,如此重复运行。

(1)流程图:

Coordinator:

Enddevice:

(2)工作过程:

Coordinator:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,启动网络,启动后,灭灯0,若有新结点加入,灭灯1;判断是否SW0被按下,若按下了,则调用vLcdShadowClear()函数清除影子内存, display(y, SIZE,2)函数写影子内存,再写影子内存前将数据转换成字符,vLcdRefresh()函数将影子内存的内容复制到LCD并显示,调用函数vSendData()向enddevice发送x;在程序运行过程中若接收到enddevice发送的数据,则调用vLedControl(3,bToggle)控制coordinator的灯3亮灭,再调用vLcdShadowClear()、display(y, SIZE,2)、 vLcdRefresh()三个函数显示,再调用函数vSendData()向enddevice发送x。

Enddevice:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,加入网络,加入成功后,灭灯0;判断若接收到coordinator发送的数据,则调用vLedControl(3,bToggle)控制coordinator的灯3亮灭,再将接收的数据加11(本人学号),最后调用BOS时钟周期性调用vAppTick函数,函数中调用vSendData()向coordinator发送x,这样就能实现定时发送。

四、实验结果与分析

1. 网络启动成功后,即coordinator灯0,1熄灭,enddevice灯1熄灭;按下coordinator的SW3,则enddevice的LED3亮,按下enddevice的SW0,则coordinator的LED0亮。可见能够达到按键控制对方的效果,符合设计要求。

2. 网络启动成功后,即coordinator灯0,1熄灭,enddevice灯1熄灭;按下coordinator的SW0液晶上显示初始数据“0011”,接下来enddevice的LED3状态变化,1s后coordinatorLED3状态改变,且显示数据加11,这样循环下去。可见符合设计要求。

分析:在网络启动后,有新结点加入时coordinator可以获得其短地址,因此可以将数据发送给enddevice,enddevice在接收到coordinator的消息后也相应获得了其短地址,接下去就可以相互发送数据。

五、存在问题和解决方法

1. 在下载完程序运行时,coordinator的灯0无法熄灭,从而导致所有操作无效。

解决方法:coordinator的LED0不灭,说明无法启动网络,此时应该考虑信道干扰问题,所以我将信道改了一下,改了16号信道,再运行就成功了。

2. 液晶不能正常显示。

解决方法:经考虑发现,发送接收的数据,显示的是字符,所以不能直接将接收的数据写入影子内存,所以我在display()函数中最前面加入了数据转换成字符的语句,接下来再进行写影子内存,这样显示就正常了。

通信新技术综合训练报告

实验四 两个EndDevice之间的无线通信实验

一、实验内容

1. 分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址。按下EndDevice A的按钮SW0发送广播请求绑定信息,LED0闪烁,收到该信息的EndDevice B的LED0闪烁,按下其按钮SW0则返回绑定应答信息,同时LED0处于点亮状态,EndDevice A收到应答后LED0也处于点亮状态,表示双方绑定成功。之后按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。

2. 分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址及绑定的媒介。按动EndDevice按钮SW0,向Coordinator发送绑定请求信息,LED0闪烁10秒,Coordinator收到该信息后记录其短地址并定时10秒,按动另外一个EndDevice的按钮SW0向Coordinator发送绑定应答信息,LED0闪烁5秒,在有效定时时间10秒内若Coordinator收到该应答信号,则记录其短地址,分别将记录的两个短地址发送给两个对应EndDevice,两个EndDevice收到短地址后分别点亮LED0(不再闪烁),若在规定时间内没有建立绑定关系,超时后灭LED0。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。绑定状态下按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。

二、实验原理

1. 通过对方的MAC地址获得它的16位短地址

在基于Jennic ZigBee协议栈中,每个设备必须知道对方的16位短地址,才能进行直接通信,而16位短地址是在EndDevice或Router加入网络时由Coordinator动态分配的。如果一个设备(请求者)知道另一个设备的MAC地址时,则请求者可通过调用zdpNwkAddrReq( )函数广播查寻与该MAC地址相匹配的结点,当匹配的结点收到该数据包则返回自己的短地址给请求者,请求者即可用该短地址与其进行通信。

2. 通过广播请求对方绑定获得它的16位短地址

在使用afdeDataRequest( )函数发送数据包时,将16位的目标地址设置为0xffff,即可以广播的形式将数据包发送出去。一个设备(请求者)想获取另一个设备的16位短地址的方法是:发送一个广播请求绑定指令数据包,符合条件的结点(如判断指令包内容,按下按钮等)发送应答包(含自己的短地址)给请求者,请求者即可用该短地址与其进行通信。

3. 通过发送请求/应答绑定信息给Coordinator获得对方的16位短地址

按动EndDevice或Router按钮,调用afdeDataRequest( )函数向Coordinator发送绑定请求信息,Coordinator收到该信息后记录其短地址并定时,按动另外一个结点的按钮使用afdeDataRequest( )函数向Coordinator发送绑定应答信息,在有效定时时间内若

Coordinator收到该应答信号,则记录其短地址,分别将记录的两个段地址发送给两个对应结点,两个结点收到短地址后便可以相互直接通信。

4. 网络地址请求函数zdpNwkAddrReq( )

在Coordinator与EndDevice实现的点对点实验介绍了Coordinator获取16位短地址的方法,而对于EndDevice和Router,当一个结点知道另一个结点的MAC地址后,则可以通过网络地址请求函数zdpNwkAddrReq( )以广播的方式发送数据包,查找与该MAC地址相匹配的结点在网络中的短地址。协议栈可通过调用JZA_vZdpResponse( )函数处理响应消息。

5.网络地址请求响应函数JZA_vZdpResponse( )

JZA_vZdpResponse( )是一个协议栈调用应用程序的函数,当一个结点通过zdpNwkAddrReq( )发送查找另一个结点的短地址后,匹配的结点发送的应答消息可通过请求者的协议栈调用JZA_vZdpResponse( )处理。

三、软件设计

1. 分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址。按下EndDevice A的按钮SW0发送广播请求绑定信息,LED0闪烁,收到该信息的EndDevice B的LED0闪烁,按下其按钮SW0则返回绑定应答信息,同时LED0处于点亮状态,EndDevice A收到应答后LED0也处于点亮状态,表示双方绑定成功。之后按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。

(1)流程图:

Coordinator:

通信新技术综合训练报告 EnddeviceA: nddeviceA:

实验四 两个 EndDevice 之间的无线通信实验

第 15 页,共 48 页

(2)工作过程:

Coordinator:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,启动网络,启动后,灭灯0。只是负责建网。

EnddeviceA:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,加入网络,加入成功后,灭灯0;判断若按下SW0键,则调用vSendData(0)函数发送广播信息(我发送的为数据0,目标地址为0xffff);判断是否收到应答信息(EnddeviceB发送的数据0),若收到,则调用vLedControl(1,TRUE)控制灯0亮,并且获取对方短地址,此时能够与EnddeviceB进行通信;读取按键值,若读取成功,调用vProcessSplashKeyPress()函数进行按键处理;同时若收到目标地址的MSG信息,则执行对应控制指令。

EnddeviceB:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,加入网络,加入成功后,灭灯0;判断若接收到广播信息(为数据0),获取对方短地址,则现在若按下SW0,则调用vLedControl(1,TRUE)控制LED0亮,并且调用vSendData(0)函数发送应答信息(数据0),此时与EnddeviceA建立通信 ;读取按键值,若读取成功则调用vProcessSplashKeyPress()函数进行按键处理;同时若收到目标地址的MSG信息,则执行对应控制指令。

2. 分别为Coordinator和EndDevice设计一个程序,其功能为:Coordinator负责建立网络和分配短地址及绑定的媒介。按动EndDevice按钮SW0,向Coordinator发送绑定请求信息,LED0闪烁10秒,Coordinator收到该信息后记录其短地址并定时10秒,按动另外一个EndDevice的按钮SW0向Coordinator发送绑定应答信息,LED0闪烁5秒,在有效定时时间10秒内若Coordinator收到该应答信号,则记录其短地址,分别将记录的两个短地址发送给两个对应EndDevice,两个EndDevice收到短地址后分别点亮LED0(不再闪烁),若在规定时间内没有建立绑定关系,超时后灭LED0。如果按下任何EndDevice的SW1则解除绑定,各EndDevice的LED0灭,且LED1闪烁3秒。绑定状态下按动每个EndDevice的按钮SW2、SW3可分别切换对方对应LED亮/灭状态。

(1)流程图:

Coordinator:

通信新技术综合训练报告 enddeviceA:

实验四 两个 EndDevice 之间的无线通信实验

开始

初始化子程序否 是否成功加入网络是

读取按键值是否按下SW0 是

调用vSendData()函数发送绑定请求信息(数据0)

调用vAppTickLED1函数定时闪烁10s

是否收到短地址是

点亮LED0 将收到的短地址保存为目标地址

读取按键值

有MSG信息? 是

是否有按键按下 数据1 SW0 SW1 SW2 SW3 发送3 取消绑定

数据2 控制LED2

SW3 控制LED3

取消绑定

发送2

调用vAppTickLED函数定时闪烁3s

第 18 页,共 48 页

(2)工作过程:

Coordinator:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,启动网络,启动后,灭灯0。判断若收到enddeviceA的绑定应答信息(数据0),保存其短地址为addr1, BOS时钟周期性调用vAppTickLED函数定时闪烁10s;在10s内若收到enddeviceB的绑定应答信息,调用vLedControl(0,TRUE)控制灯0亮,保存其短地址给addr2,并发送给enddeviceA,再将addr1发送给enddeviceB。此时coordinator完成任务。

EnddeviceA:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,加入网络,加入成功后,灭灯0;判断若按下SW0键,则调用vSendData(0)函数向coordinator发送绑定请求信息(数据0),BOS时钟周期性调用vAppTickLED1函数定时闪烁10s;若收

到coordinator发送的短地址,则保存短地址为目标地址,并调用vLedControl(1,TRUE)控制灯1亮;读取按键值,若读取成功,调用vProcessSplashKeyPress()函数进行按键处理;同时若收到目标地址的MSG信息,则执行对应控制指令。

EnddeviceB:执行AppColdStart( )函数,设置信道号和PAN ID;调用vInit()函数,初始化按键、LED灯和协议栈,并且启动BOS时钟;调用JZS_vStartStack ( )函数,加入网络,加入成功后,灭灯0;判断若按下SW0键,则调用vSendData(0)函数向coordinator发送绑定应答信息(数据9),BOS时钟周期性调用vAppTickLED1函数定时闪烁5s;若收到coordinator发送的短地址,则保存短地址为目标地址,并调用vLedControl(1,TRUE)控制灯1亮;读取按键值,若读取成功,调用vProcessSplashKeyPress()函数进行按键处理;同时若收到目标地址的MSG信息,则执行对应控制指令。

四、实验结果与分析

1. 当coordinator的LED0灭掉后,按下enddeviceA的SW0,enddeviceB的LED0闪烁,此时按下其SW0,两个enddevice的LED0都点亮,之后按下每个EndDevice的按钮SW2、SW3可分别切换对方对应LED2、LED3亮/灭状态。如果按下任何EndDevice的SW1,各EndDevice的LED0灭,且LED1闪烁3秒,此时所有操作无效。

分析:coordinator的LED0熄灭后,建网成功,enddevice获得各自短地址,按下enddeviceA的SW0,发送广播消息,enddeviceB收到后同时获得对方短地址,此时按下SW0向enddeviceA发送应答消息(数据0),enddeviceA也获得了enddeviceB的短地址,此时就能进行通信,当按下其中一个的SW1时,将各自短地址初始化为0,就解除了绑定关系。

2. 当coordinator的LED0灭掉后,按下enddeviceA的SW0,此时enddeviceA与coordinator的LED0同时闪烁,在10s内按下enddeviceB的SW0,coordinator的LED0灭,接着enddeviceA与enddeviceB的LED0点亮,此时按下enddeviceA的SW2或SW3,enddeviceB的对应LED2和LED3改变当前状态(由亮变灭或由灭变亮),按下enddeviceB的SW2或SW3也是如此。若按下其中一个的SW1,对应的LED0闪烁3s,此时所有操作无效。

分析:按下enddeviceA的SW0后coordinator接收绑定请求信息,当enddeviceB按下SW0后,coordinator确定绑定应答信息,给enddeviceA与enddeviceB建立绑定关系,此时两者就能正常通信了。当按下其中一个的SW1时,将各自短地址初始化为0,就解除了绑定关系。

五、存在问题和解决方法

1. enddeviceA与enddeviceB不能建立绑定关系。

解决方法:经过分析知道原因是coordinator不能成功发送短地址给enddevice,我将原来vSendData(uint8 data)改成了vSendData(uint8 data,uint16 addr16),这样就能发送16位短地址了。

本文来源:https://www.bwwdw.com/article/a6km.html

Top