查看: 1909|回复: 0
打印 上一主题 下一主题

zstack串口助手如何发送数据给协调器? [

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-27 18:25:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
根据weebee的例子改了一下。我每次发送 FE 02 41 80 01 01 00.(这里的CM0 CM1是在另一个例子里看来的,不知道是什么意思) 1S发一次,协调器接到串口时间之后,把数据广播出去。发送数据一多,协调器就再也收不到数据了。
不知道是什么原因。求大神指教。

void MT_UartProcessZToolData ( uint8 port, uint8 event )
{
  uint8  ch;
  uint8  bytesInRxBuffer;

  (void)event;  // Intentionally unreferenced parameter

  while (Hal_UART_RxBufLen(port))
  {

    HalUARTRead (port, &ch, 1);
    //HalLedSet(HAL_LED_1,HAL_LED_MODE_TOGGLE);
    switch (state)
    {
      case SOP_STATE:
        if (ch == MT_UART_SOF)
          state = LEN_STATE;
        break;

      case LEN_STATE:
        LEN_Token = ch;

        tempDataLen = 0;

        /* Allocate memory for the data */
        pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t ) +
                                                        MT_RPC_FRAME_HDR_SZ + LEN_Token );

        if (pMsg)
        {
          /* Fill up what we can */
          pMsg->hdr.event = CMD_SERIAL_MSG;
          pMsg->msg = (uint8*)(pMsg+1);
          pMsg->msg[MT_RPC_POS_LEN] = LEN_Token;
          state = CMD_STATE1;
        }
        else
        {
          state = SOP_STATE;
          return;
        }
        break;

      case CMD_STATE1:
        pMsg->msg[MT_RPC_POS_CMD0] = ch;
        state = CMD_STATE2;
        break;

      case CMD_STATE2:
        pMsg->msg[MT_RPC_POS_CMD1] = ch;
        /* If there is no data, skip to FCS state */
        if (LEN_Token)
        {
          state = DATA_STATE;
        }
        else
        {
          state = FCS_STATE;
        }
        break;

      case DATA_STATE:

        /* Fill in the buffer the first byte of the data */
        pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen++] = ch;

        /* Check number of bytes left in the Rx buffer */
        bytesInRxBuffer = Hal_UART_RxBufLen(port);

        /* If the remain of the data is there, read them all, otherwise, just read enough */
        if (bytesInRxBuffer <= LEN_Token - tempDataLen)
        {
          HalUARTRead (port, &pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen], bytesInRxBuffer);
          tempDataLen += bytesInRxBuffer;
        }
        else
        {
          HalUARTRead (port, &pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen], LEN_Token - tempDataLen);
          tempDataLen += (LEN_Token - tempDataLen);
        }

        /* If number of bytes read is equal to data length, time to move on to FCS */
        if ( tempDataLen == LEN_Token )
            state = FCS_STATE;

        break;

      case FCS_STATE:

        FSC_Token = ch;

        /* Make sure it's correct */
        //if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ + LEN_Token) == FSC_Token))
       // {
          osal_msg_send( App_TaskID, (byte *)pMsg );
       // }
       // else
       // {
          /* deallocate the msg */
       //   osal_msg_deallocate ( (uint8 *)pMsg );
       // }

        /* Reset the state, send or discard the buffers at this point */
        state = SOP_STATE;

        break;

      default:
       break;
    }
  }
}
复制代码



调试发现下面的提示串口输出代码,只要都注释掉,就很容易就死掉了。
放着就能正常工作挺久。
void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)
{
  uint8 i,len,*str=NULL;     //len有用数据长度
  str=cmdMsg->msg;          //指向数据开头
  len=*str;                 //msg里的第1个字节代表后面的数据长度

  /********打印出串口接收到的数据,用于提示*********/
  //Onboard_wait(300);
  //for(i=0;i<=len+2;i++)
  //HalUARTWrite(0,str+i,1 );
  HalUARTWrite(0,"\n",1 );//换行  
  HalLedSet(HAL_LED_1,HAL_LED_MODE_TOGGLE);
  /*******发送出去***参考网蜂 1小时无线数据传输教程*********/

  if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,
                            SAMPLEAPP_PERIODIC_CLUSTERID,//自己定义一个
                            len+3,                  // 数据长度         
                            str,                     //数据内容
                            &SampleApp_TransID,
                            AF_DISCV_ROUTE,
                            AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
                             {
                             }
  else
  {
  // Error occurred in request to send.
  }
}
复制代码转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表