Zigbee无线收发串口实验注释代码19-4-10

<p>效果是协调器建立网络后,终端加入网络并向协调器发送字符串,协调器通过串口将收到的字符串发到PC<br/></p><p><br/></p><p>Coordinator.c</p><pre class="prism-highlight prism-language-c">#include&nbsp;&quot;OSAL.h&quot;//为了实现多事件和多任务切换,需要把事件和任务对应的应用,并起一个名字OSAL操作系统抽象层。

#include&nbsp;&quot;AF.h&quot;

#include&nbsp;&quot;ZDApp.h&quot;

#include&nbsp;&quot;ZDObject.h&quot;

#include&nbsp;&quot;ZDprofile.h&quot;

#include&nbsp;&lt;string.h&gt;

#include&nbsp;&quot;Coordinator.h&quot;

#include&nbsp;&quot;DebugTrace.h&quot;

#if&nbsp;!defined(&nbsp;WIN32)

#include&nbsp;&quot;OnBoard.h&quot;

#endif

#include&nbsp;&quot;hal_lcd.h&quot;

#include&nbsp;&quot;hal_led.h&quot;

#include&nbsp;&quot;hal_key.h&quot;

#include&nbsp;&quot;hal_uart.h&quot;

const&nbsp;cId_t&nbsp;GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]&nbsp;=&nbsp;

{

&nbsp;&nbsp;GENERICAPP_CLUSTERID

};//const&nbsp;常量&nbsp;

const&nbsp;SimpleDescriptionFormat_t&nbsp;GenericApp_SimpleDesc&nbsp;=

{

&nbsp;&nbsp;GENERICAPP_ENDPOINT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;int&nbsp;Endpoint;

&nbsp;&nbsp;GENERICAPP_PROFID,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;uint16&nbsp;AppProfId[2];

&nbsp;&nbsp;GENERICAPP_DEVICEID,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;uint16&nbsp;AppDeviceId[2];

&nbsp;&nbsp;GENERICAPP_DEVICE_VERSION,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;AppDevVer:4;

&nbsp;&nbsp;GENERICAPP_FLAGS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;AppFlags:4;

&nbsp;&nbsp;GENERICAPP_MAX_CLUSTERS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;&nbsp;AppNumInClusters;

&nbsp;&nbsp;(cId_t&nbsp;*)GenericApp_ClusterList,&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;*pAppInClusterList;

&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;&nbsp;AppNumInClusters;

&nbsp;&nbsp;(cId_t&nbsp;*)NULL&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;*pAppInClusterList;

};//上述数据姐构体可以用来描述一个eigbee设备节点,成为简单设备描述符

endPointDesc_t&nbsp;GenericApp_epDesc;//endPointDesc_t&nbsp;是结构体,定义在AF.h

byte&nbsp;GenericApp_TaskID;

byte&nbsp;GenericApp_TransID;&nbsp;

//unsigned&nbsp;char&nbsp;uartbuf[128];//串口缓冲区

//节点描述符&nbsp;GenericApp_epDesc&nbsp;&nbsp;&nbsp;&nbsp;任务优先级TaskID&nbsp;&nbsp;&nbsp;&nbsp;数据发送序列号TransID

void&nbsp;GenericApp_MessageMSGCB(&nbsp;afIncomingMSGPacket_t&nbsp;*pckt&nbsp;);//消息处理函数

void&nbsp;GenericApp_SendTheMessage(&nbsp;void&nbsp;);//数据发送函数

//static&nbsp;void&nbsp;rxCB(uint8&nbsp;port,uint8&nbsp;event);//串口相关

void&nbsp;GenericApp_Init(&nbsp;byte&nbsp;task_id&nbsp;)

{

&nbsp;&nbsp;halUARTCfg_t&nbsp;uartConfig;//定义串口配置结构体

&nbsp;&nbsp;GenericApp_TaskID&nbsp;=&nbsp;task_id;//初始化任务优先级

&nbsp;&nbsp;GenericApp_TransID&nbsp;=&nbsp;0;//将发送数据包序号初始化,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//每发送一个包自动加一,在接收端查看以计算丢包率

&nbsp;

&nbsp;&nbsp;GenericApp_epDesc.endPoint&nbsp;=&nbsp;GENERICAPP_ENDPOINT;//

&nbsp;&nbsp;GenericApp_epDesc.task_id&nbsp;=&nbsp;&amp;GenericApp_TaskID;//

&nbsp;&nbsp;GenericApp_epDesc.simpleDesc

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(SimpleDescriptionFormat_t&nbsp;*)&amp;GenericApp_SimpleDesc;//

&nbsp;&nbsp;GenericApp_epDesc.latencyReq&nbsp;=&nbsp;noLatencyReqs;//

&nbsp;&nbsp;afRegister(&nbsp;&amp;GenericApp_epDesc&nbsp;);//调用函数为节点描述符注册,以使用OSAL提供的服务

&nbsp;&nbsp;/*以下是串口收发实验新增部分,对串口进行配置,如是否打开串口,波特率,是否使用流控等*/

&nbsp;&nbsp;uartConfig.configured&nbsp;=&nbsp;TRUE;

&nbsp;&nbsp;uartConfig.baudRate&nbsp;=&nbsp;HAL_UART_BR_115200;

&nbsp;&nbsp;uartConfig.flowControl&nbsp;=&nbsp;FALSE;

&nbsp;&nbsp;uartConfig.callBackFunc&nbsp;=&nbsp;NULL;//在串口配置部分,回调函数不需要了

&nbsp;&nbsp;HalUARTOpen(0,&amp;uartConfig);//最后使用HalUARTOpen对串口进行初始化

}

//&nbsp;&nbsp;上述代码是该任务初始化函数

//注释为空的部分较为固定,不用修改

UINT16&nbsp;GenericApp_ProcessEvent(&nbsp;byte&nbsp;task_id,&nbsp;UINT16&nbsp;events&nbsp;)

{

//以下代码在基础串口收发实验时不用&nbsp;&nbsp;,将事件处理函数改为空函数

afIncomingMSGPacket_t&nbsp;*MSGpkt;//定义了一个指向消息接受结构体的指针MSGpkt

&nbsp;&nbsp;&nbsp;if(events&nbsp;&amp;&nbsp;SYS_EVENT_MSG)

&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSGpkt&nbsp;=&nbsp;(afIncomingMSGPacket_t&nbsp;*)osal_msg_receive(GenericApp_TaskID);//使用osal_msg_receive函数从消息队列上接受消息

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该消息包含了指向接收到数据包的指针

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(MSGpkt)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(MSGpkt-&gt;hdr.event)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{case&nbsp;AF_INCOMING_MSG_CMD://如果是无线数据,用下面函数处理

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericApp_MessageMSGCB(&nbsp;MSGpkt);//11111

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osal_msg_deallocate(&nbsp;(uint8&nbsp;*)MSGpkt);//处理完消息需要释放内存空间,调用deallocate函数以释放

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSGpkt&nbsp;=&nbsp;(afIncomingMSGPacket_t&nbsp;*)osal_msg_receive

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(GenericApp_TaskID);//处理队列中下一个消息直到处理完

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(events&nbsp;^&nbsp;SYS_EVENT_MSG);

&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;return&nbsp;0;

&nbsp;&nbsp;

}

//上述代码是消息处理函数,大部分固定,唯一可以修改的是注释标记处

//需要熟悉该函数的格式

/*串口实验中新增*/

/*static&nbsp;void&nbsp;rxCB(uint8&nbsp;port,uint8&nbsp;event)

{

&nbsp;&nbsp;HalUARTRead(0,uartbuf,7);//调用函数,从串口读取数据并存放在uartbuf中

&nbsp;&nbsp;if(osal_memcmp(uartbuf,&quot;ldztzrh&quot;,7))//判断接受到的数据,如果是,返回TURE

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;HalUARTWrite(0,uartbuf,8);//调用该函数,发送收到的数据

&nbsp;&nbsp;}

}*/

//osal_memcmp()经常使用,是一个回调函数,在&nbsp;&nbsp;uartConfig.callBackFunc&nbsp;=&nbsp;rxCB;&nbsp;处

//将rxCB传递给了成员callBackFunc,是一个函数指针,也就是将函数的地址传给callBackFunc

//这样就可以通过callBackFunc成员函数来调用rxCB()函数了。

//回调函数是在特定条件或事件发生时,由另一方调用的,用于响应

//以下代码在基础串口收发实验时不用

void&nbsp;GenericApp_MessageMSGCB(&nbsp;afIncomingMSGPacket_t&nbsp;*pkt&nbsp;)

{

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;buffer[10];

&nbsp;&nbsp;switch(pkt-&gt;clusterId)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;GENERICAPP_CLUSTERID:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osal_memcpy(buffer,pkt-&gt;cmd.Data,10);//使用osal_memcpy函数将接收到的数据拷贝到buffer中

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HalUARTWrite(0,buffer,10);//串口写函数

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;}

}</pre><p>Enddevice.c</p><pre class="prism-highlight prism-language-c">#include&nbsp;&quot;OSAL.h&quot;

#include&nbsp;&quot;AF.h&quot;

#include&nbsp;&quot;ZDApp.h&quot;

#include&nbsp;&quot;ZDObject.h&quot;

#include&nbsp;&quot;ZDProfile.h&quot;

#include&nbsp;&lt;string.h&gt;

#include&nbsp;&quot;Coordinator.h&quot;

#include&nbsp;&quot;DebugTrace.h&quot;

#if&nbsp;!defined(&nbsp;WIN32&nbsp;)

#include&nbsp;&quot;OnBoard.h&quot;

#endif

#include&nbsp;&quot;hal_lcd.h&quot;

#include&nbsp;&quot;hal_led.h&quot;

#include&nbsp;&quot;hal_key.h&quot;

#include&nbsp;&quot;hal_uart.h&quot;

#define&nbsp;SEND_DATA_EVENT&nbsp;0x01//添加新事件

const&nbsp;cId_t&nbsp;GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]&nbsp;=

{

&nbsp;&nbsp;GENERICAPP_CLUSTERID

};

const&nbsp;SimpleDescriptionFormat_t&nbsp;GenericApp_SimpleDesc&nbsp;=

{

&nbsp;&nbsp;GENERICAPP_ENDPOINT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;int&nbsp;Endpoint;

&nbsp;&nbsp;GENERICAPP_PROFID,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;uint16&nbsp;AppProfId[2];

&nbsp;&nbsp;GENERICAPP_DEVICEID,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;uint16&nbsp;AppDeviceId[2];

&nbsp;&nbsp;GENERICAPP_DEVICE_VERSION,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;AppDevVer:4;

&nbsp;&nbsp;GENERICAPP_FLAGS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;AppFlags:4;

&nbsp;&nbsp;GENERICAPP_MAX_CLUSTERS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;&nbsp;AppNumInClusters;

&nbsp;&nbsp;(cId_t&nbsp;*)GenericApp_ClusterList,&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;*pAppInClusterList;

&nbsp;&nbsp;GENERICAPP_MAX_CLUSTERS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;&nbsp;AppNumInClusters;

&nbsp;&nbsp;(cId_t&nbsp;*)GenericApp_ClusterList&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;byte&nbsp;*pAppInClusterList;

};//描述一个设备节点,参考coordinator.c文件

endPointDesc_t&nbsp;GenericApp_epDesc;

byte&nbsp;GenericApp_TaskID;

byte&nbsp;GenericApp_TransID;&nbsp;&nbsp;

devStates_t&nbsp;GenericApp_NwkState;

/*定义四个变量

//节点描述符&nbsp;GenericApp_epDesc&nbsp;&nbsp;&nbsp;&nbsp;任务优先级TaskID&nbsp;&nbsp;&nbsp;&nbsp;数据发送序列号TransID

GenericApp_NwkState&nbsp;保存节点状态*/

void&nbsp;GenericApp_MessageMSGCB(&nbsp;afIncomingMSGPacket_t&nbsp;*pckt&nbsp;);

void&nbsp;GenericApp_SendTheMessage(&nbsp;void&nbsp;);//发送函数

void&nbsp;GenericApp_Init(&nbsp;byte&nbsp;task_id&nbsp;)

{

&nbsp;&nbsp;GenericApp_TaskID&nbsp;=&nbsp;task_id;//初始化任务优先级

&nbsp;&nbsp;GenericApp_NwkState&nbsp;=&nbsp;DEV_INIT;//状态初始化为DEV_INIT表示该节点没有链接到网络

&nbsp;&nbsp;GenericApp_TransID&nbsp;=&nbsp;0;//将发送数据包序号初始化,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//每发送一个包自动加一,在接收端查看以计算丢包率

&nbsp;

&nbsp;&nbsp;GenericApp_epDesc.endPoint&nbsp;=&nbsp;GENERICAPP_ENDPOINT;//

&nbsp;&nbsp;GenericApp_epDesc.task_id&nbsp;=&nbsp;&amp;GenericApp_TaskID;//

&nbsp;&nbsp;GenericApp_epDesc.simpleDesc

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(SimpleDescriptionFormat_t&nbsp;*)&amp;GenericApp_SimpleDesc;//

&nbsp;&nbsp;GenericApp_epDesc.latencyReq&nbsp;=&nbsp;noLatencyReqs;//

&nbsp;&nbsp;afRegister(&nbsp;&amp;GenericApp_epDesc&nbsp;);//调用函数为节点描述符注册,以使用OSAL提供的服务

}

//&nbsp;&nbsp;上述代码是该任务初始化函数

//注释为空的部分较为固定,不用修改

UINT16&nbsp;GenericApp_ProcessEvent(&nbsp;byte&nbsp;task_id,&nbsp;UINT16&nbsp;events&nbsp;)

{

&nbsp;&nbsp;afIncomingMSGPacket_t&nbsp;*MSGpkt;//定义了一个指向消息接受结构体的指针MSGpkt

&nbsp;&nbsp;&nbsp;if(events&nbsp;&amp;&nbsp;SYS_EVENT_MSG)

&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSGpkt&nbsp;=&nbsp;(afIncomingMSGPacket_t&nbsp;*)osal_msg_receive(GenericApp_TaskID);//使用osal_msg_receive函数从消息队列上接受消息

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//该消息包含了指向接收到数据包的指针

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(MSGpkt)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(MSGpkt-&gt;hdr.event)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;ZDO_STATE_CHANGE:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericApp_NwkState&nbsp;=&nbsp;(devStates_t)(MSGpkt-&gt;hdr.status);//读取设备类型

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GenericApp_NwkState&nbsp;==&nbsp;DEV_END_DEVICE)//如果是终端节点,类型码为DEV_END_DEVICE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//当终端加入节点,用此函数设置事件

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此函数设置某一事件,事件发生后,执行事件处理函数

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osal_msg_deallocate(&nbsp;(uint8&nbsp;*)MSGpkt);//处理完消息需要释放内存空间,调用deallocate函数以释放

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSGpkt&nbsp;=&nbsp;(afIncomingMSGPacket_t&nbsp;*)osal_msg_receive

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(GenericApp_TaskID);//处理队列中下一个消息直到处理完

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(events&nbsp;^&nbsp;SYS_EVENT_MSG);

&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;if(events&nbsp;&amp;&nbsp;SEND_DATA_EVENT)

&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GenericApp_SendTheMessage();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,1000);//下一行解释三个参数

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(时间到达后,对其做出响应的任务,时间到达后,该事件发生,定时时间&nbsp;ms)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(events&nbsp;^&nbsp;SEND_DATA_EVENT);//清除事件标志

&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;return&nbsp;0;

}

/*在串口收发实验中,作用是调用无线发送函数,并且定时1s*/

/*

上述代码是消息处理函数,大部分固定

需要熟悉该函数的格式

*/

void&nbsp;GenericApp_SendTheMessage(void)

{

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;theMessageData[10]&nbsp;=&nbsp;&quot;EndDevice&quot;;//用于存放要发送的数据

&nbsp;&nbsp;afAddrType_t&nbsp;my_DstAddr;//为满足AF_DataRequest第一个参数定义的变量

&nbsp;&nbsp;my_DstAddr.addrMode&nbsp;=&nbsp;(afAddrMode_t)Addr16Bit;//何种方式发送(单播)

&nbsp;&nbsp;my_DstAddr.endPoint&nbsp;=&nbsp;GENERICAPP_ENDPOINT;//初始化端口号

&nbsp;&nbsp;my_DstAddr.addr.shortAddr&nbsp;=&nbsp;0x0000;//协调器地址固定为0x0000

&nbsp;&nbsp;AF_DataRequest(&nbsp;&amp;my_DstAddr,&nbsp;//目的地节点的网络地址和发送数据的格式

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;GenericApp_epDesc,//端口号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GENERICAPP_CLUSTERID,//命令号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osal_strlen(&quot;EndDevice&quot;)+1,//数据长度,发送时需要将结尾结束符一起发

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theMessageData,//指向数据缓冲区的指针

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;GenericApp_TransID,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AF_DISCV_ROUTE,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AF_DEFAULT_RADIUS);

&nbsp;&nbsp;/*调用数据发送函数AF_DataRequest进行无线数据发送&nbsp;&nbsp;*/

&nbsp;&nbsp;/HalLedBlink(HAL_LED_2,0,50,500);

}

/*数据类型afAddrType和函数AF_DataRequest原型都在书上*/</pre><p><br/></p>

Q.E.D.