[求助] 关于zigbee多对一串口透传问题

进击的学霸   2016-5-21 21:22 楼主
        目前大二,项目中需要用到zigbee。现在要用到的功能是zigbee一对多串口透传功能。在某宝上提供资料中的一对一例程上进行修改,功能大概实现了,串口持续发送数据,1秒一次的样子,同时上4个终端。可是5分钟左右就会死一个,过一会就全死了。至今不知道什么原因,贴上代码,各位大神给个建议

回复评论 (8)

  1. /*********************************************************************
  2. * INCLUDES
  3. */

  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "AF.h"
  7. #include "OnBoard.h"
  8. #include "OSAL_Tasks.h"
  9. #include "SerialApp.h"
  10. #include "ZDApp.h"
  11. #include "ZDObject.h"
  12. #include "ZDProfile.h"

  13. #include "hal_drivers.h"
  14. #include "hal_key.h"
  15. #if defined ( LCD_SUPPORTED )
  16.   #include "hal_lcd.h"
  17. #endif
  18. #include "hal_led.h"
  19. #include "hal_uart.h"

  20. /*********************************************************************
  21. * MACROS
  22. */

  23. /*********************************************************************
  24. * CONSTANTS
  25. */

  26. #if !defined( SERIAL_APP_PORT )
  27. #define SERIAL_APP_PORT  0
  28. #endif

  29. #if !defined( SERIAL_APP_BAUD )
  30.   //#define SERIAL_APP_BAUD  HAL_UART_BR_38400
  31.   #define SERIAL_APP_BAUD  HAL_UART_BR_115200
  32. #endif

  33. // When the Rx buf space is less than this threshold, invoke the Rx callback.
  34. #if !defined( SERIAL_APP_THRESH )
  35. #define SERIAL_APP_THRESH  64
  36. #endif

  37. #if !defined( SERIAL_APP_RX_SZ )
  38. #define SERIAL_APP_RX_SZ  128
  39. #endif

  40. #if !defined( SERIAL_APP_TX_SZ )
  41. #define SERIAL_APP_TX_SZ  128
  42. #endif

  43. // Millisecs of idle time after a byte is received before invoking Rx callback.
  44. #if !defined( SERIAL_APP_IDLE )
  45. #define SERIAL_APP_IDLE  6
  46. #endif

  47. // Loopback Rx bytes to Tx for throughput testing.
  48. #if !defined( SERIAL_APP_LOOPBACK )
  49. #define SERIAL_APP_LOOPBACK  FALSE
  50. #endif

  51. // This is the max byte count per OTA message.
  52. #if !defined( SERIAL_APP_TX_MAX )
  53. #define SERIAL_APP_TX_MAX  80
  54. #endif

  55. #define SERIAL_APP_RSP_CNT  4

  56. // This list should be filled with Application specific Cluster IDs.
  57. const cId_t SerialApp_ClusterList[SERIALAPP_MAX_CLUSTERS] =
  58. {
  59.   SERIALAPP_CLUSTERID1,
  60.   SERIALAPP_CLUSTERID2,
  61.   SERIALAPP_CONNECTREQ_CLUSTER,            
  62.   SERIALAPP_CONNECTRSP_CLUSTER            
  63. };

  64. const SimpleDescriptionFormat_t SerialApp_SimpleDesc =
  65. {
  66.   SERIALAPP_ENDPOINT,              //  int   Endpoint;
  67.   SERIALAPP_PROFID,                //  uint16 AppProfId[2];
  68.   SERIALAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  69.   SERIALAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  70.   SERIALAPP_FLAGS,                 //  int   AppFlags:4;
  71.   SERIALAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  72.   (cId_t *)SerialApp_ClusterList,  //  byte *pAppInClusterList;
  73.   SERIALAPP_MAX_CLUSTERS,          //  byte  AppNumOutClusters;
  74.   (cId_t *)SerialApp_ClusterList   //  byte *pAppOutClusterList;
  75. };

  76. endPointDesc_t SerialApp_epDesc =
  77. {
  78.   SERIALAPP_ENDPOINT,
  79. &SerialApp_TaskID,
  80.   (SimpleDescriptionFormat_t *)&SerialApp_SimpleDesc,
  81.   noLatencyReqs
  82. };

  83. /*********************************************************************
  84. * TYPEDEFS
  85. */

  86. /*********************************************************************
  87. * GLOBAL VARIABLES
  88. */
  89. devStates_t SampleApp_NwkState;   
  90. uint8 SerialApp_TaskID;           // Task ID for internal task/event processing.

  91. /*********************************************************************
  92. * EXTERNAL VARIABLES
  93. */

  94. /*********************************************************************
  95. * EXTERNAL FUNCTIONS
  96. */

  97. /*********************************************************************
  98. * LOCAL VARIABLES
  99. */

  100. static uint8 SerialApp_MsgID;

  101. static afAddrType_t SerialApp_TxAddr;
  102. static uint8 SerialApp_TxSeq;
  103. static uint8 *SerialApp_TxBuf;//[SERIAL_APP_TX_MAX+1];
  104. static uint8 SerialApp_TxLen;

  105. static afAddrType_t SerialApp_RxAddr;
  106. static uint8 SerialApp_RxSeq;
  107. static uint8 SerialApp_RspBuf[SERIAL_APP_RSP_CNT];

  108. /*********************************************************************
  109. * LOCAL FUNCTIONS
  110. */

  111. static void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt );
  112. static void SerialApp_Send(void);
  113. static void SerialApp_Resp(void);
  114. static void SerialApp_CallBack(uint8 port, uint8 event);
  115. static void SerialApp_DeviceConnect(void);              
  116. static void SerialApp_DeviceConnectRsp(uint8*);         
  117. static void SerialApp_ConnectReqProcess(uint8*);           

  118. /*********************************************************************
  119. * @fn      SerialApp_Init
  120. *
  121. * @brief   This is called during OSAL tasks' initialization.
  122. *
  123. * @param   task_id - the Task ID assigned by OSAL.
  124. *
  125. * @return  none
  126. */
  127. void SerialApp_Init( uint8 task_id )
  128. {
  129.   halUARTCfg_t uartConfig;

  130.   SerialApp_TaskID = task_id;
  131.   SerialApp_RxSeq = 0xC3;
  132.   SampleApp_NwkState = DEV_INIT;      
  133.   
  134.   afRegister( (endPointDesc_t *)&SerialApp_epDesc );

  135.   RegisterForKeys( task_id );

  136.   uartConfig.configured           = TRUE;              // 2x30 don't care - see uart driver.
  137.   uartConfig.baudRate             = SERIAL_APP_BAUD;
  138.   uartConfig.flowControl          = FALSE;
  139.   uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.
  140.   uartConfig.rx.maxBufSize        = SERIAL_APP_RX_SZ;  // 2x30 don't care - see uart driver.
  141.   uartConfig.tx.maxBufSize        = SERIAL_APP_TX_SZ;  // 2x30 don't care - see uart driver.
  142.   uartConfig.idleTimeout          = SERIAL_APP_IDLE;   // 2x30 don't care - see uart driver.
  143.   uartConfig.intEnable            = TRUE;              // 2x30 don't care - see uart driver.
  144.   uartConfig.callBackFunc         = SerialApp_CallBack;
  145.   HalUARTOpen (SERIAL_APP_PORT, &uartConfig);

  146. #if defined ( LCD_SUPPORTED )
  147.   HalLcdWriteString( "SerialApp", HAL_LCD_LINE_2 );
  148. #endif
  149.   
  150.   ZDO_RegisterForZDOMsg( SerialApp_TaskID, End_Device_Bind_rsp );
  151.   ZDO_RegisterForZDOMsg( SerialApp_TaskID, Match_Desc_rsp );
  152. }

  153. /*********************************************************************
  154. * @fn      SerialApp_ProcessEvent
  155. *
  156. * @brief   Generic Application Task event processor.
  157. *
  158. * @param   task_id  - The OSAL assigned task ID.
  159. * @param   events   - Bit map of events to process.
  160. *
  161. * @return  Event flags of all unprocessed events.
  162. */
  163. UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )
  164. {
  165.   (void)task_id;  // Intentionally unreferenced parameter
  166.   
  167.   if ( events & SYS_EVENT_MSG )
  168.   {
  169.     afIncomingMSGPacket_t *MSGpkt;

  170.     while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SerialApp_TaskID )) )
  171.     {
  172.       switch ( MSGpkt->hdr.event )
  173.       {
  174.       case AF_INCOMING_MSG_CMD:
  175.         SerialApp_ProcessMSGCmd( MSGpkt );
  176.         break;
  177.         
  178.       case ZDO_STATE_CHANGE:
  179.         SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
  180.         if ( (SampleApp_NwkState == DEV_ZB_COORD)
  181.             || (SampleApp_NwkState == DEV_ROUTER)
  182.             || (SampleApp_NwkState == DEV_END_DEVICE) )
  183.         {
  184.             // Start sending the periodic message in a regular interval.
  185.             HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
  186.             
  187.             if(SampleApp_NwkState != DEV_ZB_COORD)
  188.               SerialApp_DeviceConnect();              
  189.         }
  190.         else
  191.         {
  192.           // Device is no longer in the network
  193.         }
  194.         break;

  195.       default:
  196.         break;
  197.       }

  198.       osal_msg_deallocate( (uint8 *)MSGpkt );
  199.     }

  200.     return ( events ^ SYS_EVENT_MSG );
  201.   }

  202.   if ( events & SERIALAPP_SEND_EVT )
  203.   {
  204.     SerialApp_Send();
  205.     return ( events ^ SERIALAPP_SEND_EVT );
  206.   }


  207.   return ( 0 );  // Discard unknown events.
  208. }

  209. /*********************************************************************
  210. * @fn      SerialApp_ProcessMSGCmd
  211. *
  212. * @brief   Data message processor callback. This function processes
  213. *          any incoming data - probably from other devices. Based
  214. *          on the cluster ID, perform the intended action.
  215. *
  216. * @param   pkt - pointer to the incoming message packet
  217. *
  218. * @return  TRUE if the 'pkt' parameter is being used and will be freed later,
  219. *          FALSE otherwise.
  220. */
  221. void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt )
  222. {

  223.   switch ( pkt->clusterId )
  224.   {
  225.           uint8 *pointer1;

  226.   // A message with a serial data block to be transmitted on the serial port.
  227.     case SERIALAPP_CLUSTERID1: //收到发送过来的数据通过串口输出到电脑显示
  228.    //len = pkt->cmd.Data[0];
  229.       pointer1=&pkt->cmd.Data[1];//?óê?êy?Y????£????òêy?Y
  230.       HalUARTWrite(SERIAL_APP_PORT, pointer1, pkt->cmd.Data[0]);//HalUARTWrite(SERIAL_APP_PORT,pointer1,pkt.Data[0]);
  231.       break;

  232.     case SERIALAPP_CONNECTREQ_CLUSTER:
  233.       SerialApp_ConnectReqProcess((uint8*)pkt->cmd.Data);
  234.       
  235.     case SERIALAPP_CONNECTRSP_CLUSTER:
  236.       SerialApp_DeviceConnectRsp((uint8*)pkt->cmd.Data);
  237.       
  238.     default:
  239.       break;
  240.   }
  241. }

  242. /*********************************************************************
  243. * @fn      SerialApp_Send
  244. *
  245. * @brief   Send data OTA.
  246. *
  247. * @param   none
  248. *
  249. * @return  none
  250. */
  251. static void SerialApp_Send(void)
  252. {
  253.   
  254. #if SERIAL_APP_LOOPBACK
  255.     if (SerialApp_TxLen < SERIAL_APP_TX_MAX)
  256.     {
  257.         SerialApp_TxLen += HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf+SerialApp_TxLen+1,
  258.                                                       SERIAL_APP_TX_MAX-SerialApp_TxLen);
  259.     }
  260.   
  261.     if (SerialApp_TxLen)
  262.     {
  263.       (void)SerialApp_TxAddr;
  264.       if (HalUARTWrite(SERIAL_APP_PORT, SerialApp_TxBuf+1, SerialApp_TxLen))
  265.       {
  266.         SerialApp_TxLen = 0;
  267.       }
  268.       else
  269.       {
  270.         osal_set_event(SerialApp_TaskID, SERIALAPP_SEND_EVT);
  271.       }
  272.     }
  273. #else

  274.       
  275.   SerialApp_TxAddr.addrMode = (afAddrMode_t)Addr16Bit;
  276.   SerialApp_TxAddr.endPoint = SERIALAPP_ENDPOINT;
  277.   SerialApp_TxAddr.addr.shortAddr = 0x0000;
  278.   
  279.   if(AF_DataRequest    (&SerialApp_TxAddr,
  280.                        (endPointDesc_t *)&SerialApp_epDesc,
  281.                        SERIALAPP_CLUSTERID1,
  282.                        SerialApp_TxLen+1, SerialApp_TxBuf,
  283.                        &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS
  284.                        )== afStatus_SUCCESS)
  285.   {
  286.     //osal_mem_free(SerialApp_TxBuf);
  287.       SerialApp_TxLen = 0;
  288.   }
  289.   else
  290.   {
  291.      osal_set_event(SerialApp_TaskID,SERIALAPP_SEND_EVT);
  292.   }

  293. #endif
  294. }

  295. /*********************************************************************
  296. * @fn      SerialApp_Resp
  297. *
  298. * @brief   Send data OTA.
  299. *
  300. * @param   none
  301. *
  302. * @return  none
  303. */
  304. static void SerialApp_Resp(void)
  305. {
  306.   if (afStatus_SUCCESS != AF_DataRequest(&SerialApp_RxAddr,
  307.                                          (endPointDesc_t *)&SerialApp_epDesc,
  308.                                           SERIALAPP_CLUSTERID2,
  309.                                           SERIAL_APP_RSP_CNT, SerialApp_RspBuf,
  310.                                          &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS))
  311.   {
  312.     osal_set_event(SerialApp_TaskID, SERIALAPP_RESP_EVT);
  313.   }
  314. }

  315. /*********************************************************************
  316. * @fn      SerialApp_CallBack
  317. *
  318. * @brief   Send data OTA.
  319. *
  320. * @param   port - UART port.
  321. * @param   event - the UART port event flag.
  322. *
  323. * @return  none
  324. */
  325. static void SerialApp_CallBack(uint8 port, uint8 event)
  326. {
  327.     extern uint8 SerialApp_TaskID;
  328.   
  329.   SerialApp_TxLen = Hal_UART_RxBufLen(SERIAL_APP_PORT);
  330.   SerialApp_TxBuf = osal_mem_alloc(SerialApp_TxLen+1);
  331.   SerialApp_TxBuf[0] = SerialApp_TxLen;
  332.   
  333.   HalUARTRead(SERIAL_APP_PORT,SerialApp_TxBuf+1,SerialApp_TxLen);
  334.   if(!SerialApp_TxLen)
  335.     osal_mem_free(SerialApp_TxBuf);
  336.    
  337.     osal_set_event(SerialApp_TaskID,SERIALAPP_SEND_EVT);
  338.   
  339. }

  340. /*********************************************************************
  341. *********************************************************************/
  342. void  SerialApp_DeviceConnect()              
  343. {
  344. #if ZDO_COORDINATOR
  345.   
  346. #else
  347.   
  348.   uint16 nwkAddr;
  349.   uint16 parentNwkAddr;
  350.   char buff[30] = {0};
  351.   
  352.   HalLedBlink( HAL_LED_2, 3, 50, (1000 / 4) );
  353.   
  354.   nwkAddr = NLME_GetShortAddr();
  355.   parentNwkAddr = NLME_GetCoordShortAddr();
  356.   sprintf(buff, "parent:%d   self:%d\r\n", parentNwkAddr, nwkAddr);
  357.   HalUARTWrite ( 0, (uint8*)buff, strlen(buff));
  358.   
  359.   SerialApp_TxAddr.addrMode = (afAddrMode_t)Addr16Bit;
  360.   SerialApp_TxAddr.endPoint = SERIALAPP_ENDPOINT;
  361.   SerialApp_TxAddr.addr.shortAddr = parentNwkAddr;
  362.   
  363.   buff[0] = HI_UINT16( nwkAddr );
  364.   buff[1] = LO_UINT16( nwkAddr );
  365.   
  366.   if ( AF_DataRequest( &SerialApp_TxAddr, &SerialApp_epDesc,
  367.                        SERIALAPP_CONNECTREQ_CLUSTER,
  368.                        2,
  369.                        (uint8*)buff,
  370.                        &SerialApp_MsgID,
  371.                        0,
  372.                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  373.   {
  374.   }
  375.   else
  376.   {
  377.     // Error occurred in request to send.
  378.   }
  379.   
  380. #endif    //ZDO_COORDINATOR
  381. }

  382. void SerialApp_DeviceConnectRsp(uint8 *buf)
  383. {
  384. #if ZDO_COORDINATOR
  385.   
  386. #else
  387.   SerialApp_TxAddr.addrMode = (afAddrMode_t)Addr16Bit;
  388.   SerialApp_TxAddr.endPoint = SERIALAPP_ENDPOINT;
  389.   SerialApp_TxAddr.addr.shortAddr = BUILD_UINT16(buf[1], buf[0]);
  390.   
  391.   HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);
  392.   HalUARTWrite ( 0, "< connect success>\n", 23);
  393. #endif
  394. }

  395. void SerialApp_ConnectReqProcess(uint8 *buf)
  396. {
  397.   uint16 nwkAddr;
  398.   char buff[30] = {0};
  399.   
  400.   SerialApp_TxAddr.addrMode = (afAddrMode_t)Addr16Bit;
  401.   SerialApp_TxAddr.endPoint = SERIALAPP_ENDPOINT;
  402.   SerialApp_TxAddr.addr.shortAddr = BUILD_UINT16(buf[1], buf[0]);
  403.   nwkAddr = NLME_GetShortAddr();
  404.   
  405.   sprintf(buff, "self:%d   child:%d\r\n", nwkAddr, SerialApp_TxAddr.addr.shortAddr);
  406.   HalUARTWrite ( 0, (uint8*)buff, strlen(buff));
  407.   
  408.   buff[0] = HI_UINT16( nwkAddr );
  409.   buff[1] = LO_UINT16( nwkAddr );
  410.   
  411.   if ( AF_DataRequest( &SerialApp_TxAddr, &SerialApp_epDesc,
  412.                        SERIALAPP_CONNECTRSP_CLUSTER,
  413.                        2,
  414.                        (uint8*)buff,
  415.                        &SerialApp_MsgID,
  416.                        0,
  417.                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  418.   {
  419.   }
  420.   else
  421.   {
  422.     // Error occurred in request to send.
  423.   }
  424.   
  425.   HalLedSet(HAL_LED_2, HAL_LED_MODE_ON);
  426.   HalUARTWrite ( 0, "< connect success>\n", 23);
  427. }
点赞  2016-5-21 21:25
以后你问问题就直接说下你是怎么做的吧,看代码很费解,多个终端节点向协调器发送数据时,对于事件定时器你最好加一个随机数呀,你想搞死协调器吗?数据同时到的话,不丢包才怪,一般一对多可以采用组包的方式或者广播的也有采用,不过广播的话容易造成网络拥塞,我之前采用过自己定义路由表的方法,单播模拟广播的方法,相同数据量,发送间隔缩短可以达到几十ms,之前直接广播的话,需要几百ms,而且节点容易发包发着就挂了。
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-21 21:50
引用: wateras1 发表于 2016-5-21 21:50
以后你问问题就直接说下你是怎么做的吧,看代码很费解,多个终端节点向协调器发送数据时,对于事件定时器你 ...

我是终端串口接收到数据,然后调用回调函数引发发送函数事件。没用事件定时,终端发送采用点播的方式。
点赞  2016-5-22 11:32
引用: 进击的学霸 发表于 2016-5-22 11:32
我是终端串口接收到数据,然后调用回调函数引发发送函数事件。没用事件定时,终端发送采用点播的方式。

发送数据间隔多少呢?一次多大数据包呢?如果是多个终端同时发送,切记发送时间最好错开
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2016-5-22 14:55
你好,我最近也在做这个,一个协调器接收多个终端的数据,请问你最后程序改好了吗?能不能给我发一份630468665@qq.com
点赞  2017-4-20 10:12
小白问下,你不同的终端写入程序一样么,那数据区分怎么弄,希望可以回答,谢谢
点赞  2018-11-27 17:44
为什么不能下载了啊
点赞  2018-11-29 14:51
引用: TJYwww 发表于 2018-11-29 14:51
为什么不能下载了啊

提示什么?方便请截图
加油!在电子行业默默贡献自己的力量!:)
点赞  2018-11-29 14:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复