无线数据传输实验.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一小时实现无线数据传输--8
重点: ZDO_STATE_CHANGE事件
我们可以从该事件的名字上得到一点结论,ZDO是(Zigbee Device Object)的简称,State代表状态,Change代表改变。则该时间的含义 就是当当前的Zigbee节点状态发生改变的时候会触发该事件。比如一个 终端节点从刚上电到加入协调器的网络,这就会触发 ZDO_STATE_CHANGE事件,本实验中正是终端节点加入协调器的网络中 之后进入了该Case事件中。
一小时实现无线数据传输--1 实验设计思路:
在学习到基于协议栈无线发送的程序时,如果再按照实验流程来分析程序 的话就显得过于繁琐了,因为进入协议栈后,很多功能在底层实现了,开发者 在应用层可做的事情就是调用这些实现好的功能函数,并且实验在进入主事件 循环中,也不能再用顺序的思路来思考问题,正确的思路是我们开发者要知道 完成需要实现的功能需要完成几个部分,并且每个部分是在哪里实现的。 本实验首先将利用SampleApp工程中的例子来实现我们所需要的功能之后 再来分析是如何实现这一功能的。
406行添加: HalUARTWrite(0,”I get data\n”,11); 语句。
一小时实现无线数据传输--3
之后,选择 CoodinatorEB-Pro, 下载到开发板 1;(作为协调器串口跟电脑连 接)。再选择EndDeviceEB-Pro, 下载到开发板 2;(作为终端设备无线发送数 据给协调器)。
一小时实现无线数据传输--11
通过分析这段代码,主要包括了2个内容,第一个是一个 SendXXMessage函数,估计大家也都猜到了,这个函数就是发送无线 消息的函数,而第二个就是上面已经分析过的定时函数,这个定时函 数放在这里就形成了一个循环定时,每次定时完之后都会进入该函数 再次定时。下面我们重点看SampleApp_SendPeriodicMessage 函数。
一小时实现无线数据传输--4
首先给协调器板上电,之后打开串口助手设置好之后再给终端节点上电,终 端节点上电之后会寻找协调器,当寻找到的时候LED3(黄灯)会亮起,之后则 会看到串口助手接受到的消息了。
一小时实现无线数据传输--5
我们只添加了一行代码,就完成了无线数据传输的实验。 看起来好像挺简单的样子,实际上我们是使用了SampleApp 上的一个广播的例子修改而来的。下面就来剖析这个例子 来看清楚无线传输需要做的一些步骤。
一小时实现无线数据传输--6
整个实验我们可以大体分为2个部分来看,一个是发送部分、一个是接收部 分。首先先看发送部分的工作流程。
登记事件 设计编号 发送时间
设置发送内容 并设置 周期发送
数据送入 发送函数
一小时实现无线数据传输--7
1、登记事件设计编号发送时间
代码在SampleApp.c文件中的SampleApp_ProcessEvent函数中, (278-288行) case ZDO_STATE_CHANGE: SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if ( (SampleApp_NwkState == DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) ) { // Start sending the periodic message in a regular interval. osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); }
一小时实现无线数据传输--12
void SampleApp_SendPeriodicMessage( void ) { if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc, SAMPLEAPP_PERIODIC_CLUSTERID, 1, (uint8*)源自文库SampleAppPeriodicCounter, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) { } else { // Error occurred in request to send. } }
SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0X0001 SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 5000 这两个宏定义我们可以通过go to definitioin找到他们的定义的地方在 SampleApp.h文件中,开发者也可以自己定义这种格式的事件,前提是不要和 系统定义的名称还有值重复。
一小时实现无线数据传输--9
重点:
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
该函数可以当做协议栈下的定时器来使用,不过它的使用需要带3 个参数,第一个就是使用该函数的TaskID,第二个就是当定时结束的时 候向协议栈发出的消息,第三个参数是定时的时长。
整个实验基于上一个实验(Zigbee协议栈下按键实验)完成,也可以基于串口 实验完成。
一小时实现无线数据传输--2
首先按照上面说好的,通过在SampleApp工程中,添加一条语句之后观察 实验的现象。 打开按键实验(或者串口实验)的工程,找到SampleApp_MessageMSGCB
函数,在case SAMPLEAPP_PERIODIC_CLUSTERID:下添加如下语句:
一小时实现无线数据传输--10
通过分析这段代码,我们可以知道在Zigbee节点状态发生改变的时候 (通常为加入或者离开网络),节点会执行一个定时为5S的定时函数,5S 之后会将SAMPLEAPP_SEND_PERIODIC_MSG_EVT发送出去。
于是大家好奇了, SAMPLEAPP_SEND_PERIODIC_MSG_EVT会被发送到哪 去呢?我们接着向下看。 在同一个函数下面我们找到了如下代码 (312—323行)