3158|4

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

组网问题,协调器跟终端之间,大神进来看下 [复制链接]

我的流程是这样的,协调器发一个命令给终端,终端确认命令没错之后,返回温度。但是现在确认之后,温度在终端串口显示没有返回给协调器!void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
这个函数要怎样写才能做到数据返回给协调器?因为确认的时候已经进入这个函数使用了一个case,break之后还会进来吗?我还要再使用这个void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )函数里面另外一个case的
此帖出自RF/无线论坛

最新回复

1、break之后结束switch这个是C语言基础,肯定进不来。你可以把这个case放在你要接着查询的case上面,去掉break;但是容易出逻辑错误,不推荐。 2、在SampleApp_MessageMSGCB函数里面,你需要根据收到信息的簇号把对应的信息区别开来处理,给你一个我的SampleApp_MessageMSGCB函数作参考 /********************************************************************* * LOCAL FUNCTIONS */ /********************************************************************* * @fn      SampleApp_MessageMSGCB * * @brief   Data message processor callback.  This function processes *          any incoming data - probably from other devices.  So, based *          on cluster ID, perform the intended action. * * @param   none * * @return  none */ void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) {   uint16 flashTime;   uint8 temp[1+MY_COMMAND_LENTH];   uint8 i;   switch ( pkt->clusterId )   {     case SAMPLEAPP_PERIODIC_CLUSTERID:     // #ifdef ZDO_COORDINATOR           //如果是协调器         #ifdef DEBUG_OUT_MSG                                HalUARTWrite(0,"Peri Msg\r\n",10);         #endif     //    HalUARTWrite(0, &pkt->cmd.Data[0],MY_COMMAND_LENTH);     //十六进制发给PC机     //    HalUARTWrite(0,"\r\n",2);                               // 回车换行     // #else         //终端处理函数     // #endif         break;     //     //协调器发送过来的配置信息           case SAMPLEAPP_COOD_TO_END_CLUSTERID:       #ifndef ZDO_COORDINATOR           //如果不是协调器         if(pkt->cmd.Data[0]!='#') return;       if((pkt->cmd.Data[1]==CMD_SET_VALUE)||(pkt->cmd.Data[1]==CMD_QUERY_VALUE))       {         temp[0]=sizeof((uint8 *)&pkt->cmd.Data);         for(i=1;i<=MY_COMMAND_LENTH;i++)           temp[i]=pkt->cmd.Data[i-1];         SampleApp_mySETSerialCMD((uint8 *)temp);       }       #endif       break;     //终端发过来给协调器的信息(传感器数据或应答)     case SAMPLEAPP_END_TO_COOD_CLUSTERID:       #ifdef ZDO_COORDINATOR           //如果是协调器         if(pkt->cmd.Data[0]!='#') return;       if((pkt->cmd.Data[1]==CMD_RETURN_PACKET)||(pkt->cmd.Data[1]==CMD_QUERY_VALUE))       {         temp[0]=sizeof((uint8 *)&pkt->cmd.Data);         for(i=1;i<=MY_COMMAND_LENTH;i++)           temp[i]=pkt->cmd.Data[i-1];         SampleApp_myReturnSerialCMD((uint8 *)temp);       }       #endif       break;     //协调器发送过来的配置信息           case SAMPLEAPP_POINT_TO_POINT_CLUSTERID:            #ifdef ZDO_COORDINATOR           //如果是协调器         #ifdef DEBUG_OUT_MSG                                HalUARTWrite(0,"Heat Msg\r\n",10);           /*           temp=pkt->srcAddr.addr.shortAddr; //读出数据包的 16 位短地址           if( pkt->cmd.Data[0]==1 ) //路由器           HalUARTWrite(0,"ROUTER ShortAddr:0x",19); //提示接收到数据           if( pkt->cmd.Data[0]==2 ) //终端           HalUARTWrite(0,"ENDDEVICE ShortAddr:0x",22); //提示接收到数据           //将短地址分解,ASC 码打印           HalUARTWrite(0,&asc_16[temp/4096],1);           HalUARTWrite(0,&asc_16[temp%4096/256],1);           HalUARTWrite(0,&asc_16[temp%256/16],1);           HalUARTWrite(0,&asc_16[temp%16],1);                 HalUARTWrite(0,"\n",1);                //  回车换行           */         #endif         HalUARTWrite(0, &pkt->cmd.Data[0],MY_COMMAND_LENTH);     //十六进制发给PC机         HalUARTWrite(0,"\r\n",2);                               // 回车换行      #else         //终端处理函数      #endif         break;     case SAMPLEAPP_FLASH_CLUSTERID:       flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );       HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );       break;     case SAMPLEAPP_UPDATA_CLUSTERID:       SampleApp_myUpdataEvt(pkt->cmd.Data);       break;   } } 复制代码 3、你没发消息我,@也没成功;别浮躁,多查查资料,看看代码   详情 回复 发表于 2014-5-26 14:19
点赞 关注(1)
 

回复
举报

17

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
大神还没睡醒吗
此帖出自RF/无线论坛
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
@shower.xu
此帖出自RF/无线论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

4
 
都没人的啊,为什么 ZIGBEE论坛都是这样
此帖出自RF/无线论坛
 
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

5
 
1、break之后结束switch这个是C语言基础,肯定进不来。你可以把这个case放在你要接着查询的case上面,去掉break;但是容易出逻辑错误,不推荐。
2、在SampleApp_MessageMSGCB函数里面,你需要根据收到信息的簇号把对应的信息区别开来处理,给你一个我的SampleApp_MessageMSGCB函数作参考
  1. /*********************************************************************
  2. * LOCAL FUNCTIONS
  3. */

  4. /*********************************************************************
  5. * @fn      SampleApp_MessageMSGCB
  6. *
  7. * @brief   Data message processor callback.  This function processes
  8. *          any incoming data - probably from other devices.  So, based
  9. *          on cluster ID, perform the intended action.
  10. *
  11. * @param   none
  12. *
  13. * @return  none
  14. */
  15. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
  16. {

  17.   uint16 flashTime;
  18.   uint8 temp[1+MY_COMMAND_LENTH];
  19.   uint8 i;
  20.   switch ( pkt->clusterId )
  21.   {
  22.     case SAMPLEAPP_PERIODIC_CLUSTERID:
  23.     // #ifdef ZDO_COORDINATOR           //如果是协调器
  24.         #ifdef DEBUG_OUT_MSG                     
  25.           HalUARTWrite(0,"Peri Msg\r\n",10);
  26.         #endif
  27.     //    HalUARTWrite(0, &pkt->cmd.Data[0],MY_COMMAND_LENTH);     //十六进制发给PC机
  28.     //    HalUARTWrite(0,"\r\n",2);                               // 回车换行
  29.     // #else
  30.         //终端处理函数
  31.     // #endif  
  32.       break;
  33.     //
  34.     //协调器发送过来的配置信息      
  35.     case SAMPLEAPP_COOD_TO_END_CLUSTERID:
  36.       #ifndef ZDO_COORDINATOR           //如果不是协调器  
  37.       if(pkt->cmd.Data[0]!='#') return;
  38.       if((pkt->cmd.Data[1]==CMD_SET_VALUE)||(pkt->cmd.Data[1]==CMD_QUERY_VALUE))
  39.       {
  40.         temp[0]=sizeof((uint8 *)&pkt->cmd.Data);
  41.         for(i=1;i<=MY_COMMAND_LENTH;i++)
  42.           temp[i]=pkt->cmd.Data[i-1];
  43.         SampleApp_mySETSerialCMD((uint8 *)temp);
  44.       }
  45.       #endif
  46.       break;
  47.     //终端发过来给协调器的信息(传感器数据或应答)
  48.     case SAMPLEAPP_END_TO_COOD_CLUSTERID:
  49.       #ifdef ZDO_COORDINATOR           //如果是协调器  
  50.       if(pkt->cmd.Data[0]!='#') return;
  51.       if((pkt->cmd.Data[1]==CMD_RETURN_PACKET)||(pkt->cmd.Data[1]==CMD_QUERY_VALUE))
  52.       {
  53.         temp[0]=sizeof((uint8 *)&pkt->cmd.Data);
  54.         for(i=1;i<=MY_COMMAND_LENTH;i++)
  55.           temp[i]=pkt->cmd.Data[i-1];
  56.         SampleApp_myReturnSerialCMD((uint8 *)temp);
  57.       }
  58.       #endif
  59.       break;
  60.     //协调器发送过来的配置信息      
  61.     case SAMPLEAPP_POINT_TO_POINT_CLUSTERID:      
  62.      #ifdef ZDO_COORDINATOR           //如果是协调器
  63.         #ifdef DEBUG_OUT_MSG                     
  64.           HalUARTWrite(0,"Heat Msg\r\n",10);
  65.           /*
  66.           temp=pkt->srcAddr.addr.shortAddr; //读出数据包的 16 位短地址
  67.           if( pkt->cmd.Data[0]==1 ) //路由器
  68.           HalUARTWrite(0,"ROUTER ShortAddr:0x",19); //提示接收到数据
  69.           if( pkt->cmd.Data[0]==2 ) //终端
  70.           HalUARTWrite(0,"ENDDEVICE ShortAddr:0x",22); //提示接收到数据
  71.           //将短地址分解,ASC 码打印
  72.           HalUARTWrite(0,&asc_16[temp/4096],1);
  73.           HalUARTWrite(0,&asc_16[temp%4096/256],1);
  74.           HalUARTWrite(0,&asc_16[temp%256/16],1);
  75.           HalUARTWrite(0,&asc_16[temp%16],1);      
  76.           HalUARTWrite(0,"\n",1);                //  回车换行
  77.           */
  78.         #endif
  79.         HalUARTWrite(0, &pkt->cmd.Data[0],MY_COMMAND_LENTH);     //十六进制发给PC机
  80.         HalUARTWrite(0,"\r\n",2);                               // 回车换行
  81.      #else
  82.         //终端处理函数
  83.      #endif  
  84.       break;
  85.     case SAMPLEAPP_FLASH_CLUSTERID:
  86.       flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
  87.       HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
  88.       break;
  89.     case SAMPLEAPP_UPDATA_CLUSTERID:
  90.       SampleApp_myUpdataEvt(pkt->cmd.Data);
  91.       break;
  92.   }
  93. }
复制代码

3、你没发消息我,@也没成功;别浮躁,多查查资料,看看代码

此帖出自RF/无线论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表