HalLedBlink ( HAL_LED_4, 0, 50, 500 ); }
ZDApp_RegisterCBs();
//注册ZDO消息,只有注册了的消息才能以ZDO_CB_MSG消息的形式发送给指定的任务
} /* ZDO_Init() */
事件处理函数SAPI_ProcessEvent(),在任何地方只要调用osal_set_event()对这个处理函数对应的任务ID设置了事件的话就会启动这个事件处理函数。
系统消息事件SYS_EVENT_MSG包含几个子类的消息(子类可以在文档【Z-Stack Sample Applications (F8W-2006-0023).pdf】中找到),SYS_EVENT_MS由函数osal_msg_send()【OSAL.C】发送,osal_msg_send()首先将传过来的任务ID加入到消息包中,然后再把这个消息包通过osal_msg_enqueue加入到消息队列中,(osal_qHead是消息队列的头指针),然后我们再来查找调用osal_msg_send()的函数,这样我们就可以知道系统消息SYS_EVENT_MSG是在什么情况下如何发出的了。afDataConfirm()【AF.c】会调用osal_msg_send(),并且构造的消息中包含事件AF_DATA_CONFIRM_CMD(此事件说明由AF_DataRequest()初始化的数据已成功发送,若AF_DataRequest()的选项中要求有回应,则此事件表示目标已收到数据)
void afDataConfirm( uint8 endPoint, uint8 transID, ZStatus_t status ) {
endPointDesc_t *epDesc; afDataConfirm_t *msgPtr;
//每个终端都需要一个描述,如果没有则直接返回 epDesc = afFindEndPointDesc( endPoint ); if ( epDesc == NULL ) return;
??????
// Determine the incoming command type
msgPtr = (afDataConfirm_t *)osal_msg_allocate( sizeof(afDataConfirm_t) ); if ( msgPtr ) {
// Build the Data Confirm message
msgPtr->hdr.event = AF_DATA_CONFIRM_CMD; //设置消息的事件为AF_DATA_CONFIRM_CMD msgPtr->hdr.status = status; msgPtr->endpoint = endPoint; msgPtr->transID = transID;
//给指定任务发送消息,并且设置事件数组中SYS_EVENT_MS事件准备好 osal_msg_send( *(epDesc->task_id), (byte *)msgPtr ); }
}
换个思路看看SAPI的事件处理函数当接收到数据的时候干了些什么,然后找出接收数据的函数!从文档中我们得知当采集器接收到数据后就会发送到串口,好那么就找出发送串口数据的处理函数:SAPI_ReceiveDataIndication(),当收到系统消息中的事件为AF_INCOMING_MSG_CMD事调用此函数,afBuildMSGIncoming()会构造基于此事件的消息,而afIncomingData将会调用此函数,
作者:Free
原文来源:61IC中国电子在线