返回该小组首页 回复主题
dongdong19

dongdong19

小组等级:     E币:167  (E币换礼)

#1楼主:关于04无线龙精简Callbacks 问题

文章发表于:2008-09-08 11:27

看很多程序后面都有一些类似于LRWPAN_STATUS_ENUM  usrZepRxCallback

BOOL usrJoinNotifyCallback 的Callback程序,这部分程序有什么用处,具体怎么用,谢谢

jjh5600

   小组等级:    E币:684  (E币换礼)

#2

文章发表于:2008-09-08 15:51

以下文章摘自阿元的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()函数的原因。



dongdong19

   小组等级:    E币:167  (E币换礼)

#3

文章发表于:2008-09-08 22:06

虽然不是很明白,但是还是谢啦,

jjh5600

   小组等级:    E币:684  (E币换礼)

#4

文章发表于:2008-09-09 08:11

大体就是 具体数据包相关处理函数  接收到包之后要做什么样的处理之类的

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章