本次实验实现终端节点将数据0123456789
通过无线发送到协调器,协调器通过串口发送给PC
上位机显示出来,此实验是基于SampleApp
工程进行的。
打开SampleApp.c
文件,搜索找到函数void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
,在case SAMPLEAPP_PERIODIC_CLUSTERID:
下面加入HalUARTWrite(0, "I get data\n", 11);
。
选择CoodinatorEB
,下载到开发板1
(作为协调器串口跟电脑连接)。
选择EndDeviceEB
,下载到开发板2
(作为终端设备无线发送数据给协调器)。
发送部分
发送部分(可以将这部分内容理解成是发送终端需要执行的):
1. 登记事件,设置编号、发送时间等。打开SampleApp.c
文件,找到SampleApp
事件处理函数uint16 SampleApp_ProcessEvent(uint8 task_id, uint16 events)
,找到函数中下面的代码:
/* Received whenever the device changes state in the network */
case ZDO_STATE_CHANGE: /* 当网络状态改变时,如从未连上状态到连上网络状态 */
SampleApp_NwkState = ( lustered_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 );
} else {
/* Device is no longer in the network */
}
break;
第7
行是代码的关键部分,函数的这三个参数决定了周期性发送数据的命脉。分别查看它们的定义:
SampleApp_TaskID
是任务ID
,函数开头定义了SampleApp_TaskID = task_id;
,也就是SampleApp
初始化的任务ID
号。SAMPLEAPP_SEND_PERIODIC_MSG_EVT
的解释是Application Events (OSAL) - These are bit weighted definitions.
,定义为#define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001
,同一个任务下可以有多个事件,这个是事件的号码。我们可以定义自己的事件,但是编号不能重复,而且事件号码16
位必须只占1
位,所以只能定义16
个事件。SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT
的解释是Send Message Timeout Every 5 seconds
,定义为#define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 5000
,即事件重复执行的时间。这里以毫秒为单位,所以是5s
,也就是实验为什么隔约5s
收到数据的原因,这里可以改成你需要发送数据的时间间隔。
登记好事件后,看第二行代码可以知道,如果网络一直处于连接状态,就不会再次进入这个函数了,所以这段代码相当于初始化,只执行1
次。
2. 设置发送内容,自动周期性地发送:在同一个函数下面可以找到如下代码:
/* Send a message out -- This event is generated by a timer (setup in SampleApp_Init()). */
if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )