以下文章摘自阿元的blog :http://blog.sina.com.cn/s/blog_4c8287230100alka.html
0研究动机
在无线收发数据过程中,总是不能够确定节点接收数据包后是怎样对数据进行处理的,仅仅知道当节点接受到数据包后会调用usrRxPacketCallback()回调函数来对数据包进行处理,但是不清楚具体的步骤。这个误区给我们在编写程序的时候有很大的影响,特别是最近进行的透明串口的试验。所以需要对usrRxPacketCallback()函数的作用特别是回调的过程有一个研究,掌握此函数在协议栈中的轨迹。
1 usrRxPacketCallback()的作用
从函数名称看,usrRxPacketCallback()函数是用户接收数据包回调函数。他的作用是当节点接收到数据包之后,从APS层上调用此函数并对数据包进行处理,已完成节点对数据包的操作。
2 usrRxPacketCallback()在APS层上的调用
虽然这个函数的定义是在最顶层的用户自定义应用程序中,但是通过仔细的阅读无限龙的这个协议栈我们可以发现,真正调用这个函数却是在协议栈的APS层中。在整个协议栈中一共有三次调用此函数,分别是在apsFSM()、apsInjectPacket()和apsRxFSM()三个函数中。因为本人目前尚没有看到协议栈的APS层,所以对这些函数的作用也仅仅是凭借自己的理解进行的一些推断,如果有错误请大家多多指教。
在apsFSM()函数中调用的部分如下:
……
case APS_STATE_INDIRECT_LOOPBACK:
if (apsRxBusy()) break;
rxPtr = &aps_pib.rxBuff[aps_pib.rxTail];
halUtilMemCopy((BYTE*)&a_aps_rx_data,(BYTE*)rxPtr,sizeof(APS_RX_DATA));
usrRxPacketCallback();
apsState = APS_STATE_INDIRECT_GETDST;
goto apsFSM_start;
……
这部分代码是在COORD的条件宏定义中的,而只有COORD在发送数据的时候要求向自己发送一个数据报的时候才将APS状态设置为APS_STATE_INDIRECT_LOOPBACK,而只有此时才会调用函数usrRxPacketCallback(),我觉得这里的目的很明确,就是要COORD获得自己发送的数据包信息。
在apsInjectPacket()函数中调用的部分如下:
……
if (indirect_flag)
{
#ifdef LRWPAN_COORDINATOR
a_aps_rx_data.dstSADDR = 0;
a_aps_rx_data.aps_fcf = a_aps_tx_data.aps_fcf|APS_FRM_INDIRECT_SUBMODE_MASK ;
apsRxBuffAdd(&a_aps_rx_data);
aps_pib.flags.bits.indirectPending = 1;
apsRxState = APS_RXSTATE_RESOLVE_INDIRECT;
#endif
}
else
{
if (a_aps_rx_data.dstEP == 0)
{
DEBUG_STRING(DBG_INFO,"APS: Received ZEP Request.\n");
zepHandleRxPacket();
MemFree(a_aps_rx_data.orgpkt.data);
}
else
{
usrRxPacketCallback();
MemFree(a_aps_rx_data.orgpkt.data);
}
}
……
首先说明一下apsInjectPacket()函数的作用,本人认为这个函数的作用是当收到数据包之后会将数据包加入到协议栈中以完成在协议栈中的相关操作。在这里调用usrRxPacketCallback()函数的作用是向终端节点发送数据。
最后我们来看一下在apsRxFSM()函数中的代码:
case APS_RXSTATE_START:
callback_status = usrRxPacketCallback();
在这个函数中调用usrRxPacketCallback()函数的用意也很明显,就是要查看一下数据包的回调状态(因为函数定义的是在完成对接收到的数据报的处理后返回一个LRWPAN_STATUS_SUCCESS状态)。
3 结论
看过APS层调用过这个函数的几段代码之后,我们就可以明白只有在进行相关的数据包处理的时候才会调用他。在透明串口的试验中出现的在接收方的串口显示中会出现两次数据包信息的情况就是因为在整个协议栈中调用了多次usrRxPacketCallback()函数的原因。
文章评论(0条评论)
登录后参与讨论