Zigbee网关 Zstack增加串口功能2-修改应用层APP/ZigbeeGateWay.c

来源:互联网 发布:淘宝评价什么时候显示 编辑:程序博客网 时间:2024/05/29 19:20

1.定义串口消息结构体


typedef struct{  osal_event_hdr_t hdr;  uint8 data;  // } UartRx_t;

2.在初始化函数中添加


  MT_UartInit ();   // SPIMgr_RegisterTaskID( task_id );  MT_UartRegisterTaskID(ZigbeeGateWay_TaskID);


3.在消息处理函数中添加SPI_INCOMING_ZAPP_DATA消息到来的时候对应的消息处理函数


uint16 ZigbeeGateWay_ProcessEvent( uint8 task_id, uint16 events ){  afIncomingMSGPacket_t *MSGpkt;  (void)task_id;  // Intentionally unreferenced parameter  if ( events & SYS_EVENT_MSG )  {    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( ZigbeeGateWay_TaskID );    while ( MSGpkt )    {      switch ( MSGpkt->hdr.event )      {#if defined ( APP_UIP )        case UIP_INCOME:          APP_uIP_Message_Process(((uIP_Msg_t *)MSGpkt)->msg,((uIP_Msg_t *)MSGpkt)->length);          break;#endif        // Received when a key is pressed        case KEY_CHANGE:          ZigbeeGateWay_HandleKeys(((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys);          break;                  // Received when a uart rx data        case SPI_INCOMING_ZAPP_DATA:          ZigbeeGateWay_HandleUart(((UartRx_t *)MSGpkt)->hdr.status, &(((UartRx_t *)MSGpkt)->data));          break;               // Received when a messages is received (OTA) for this endpoint        case AF_INCOMING_MSG_CMD:          ZigbeeGateWay_MessageMSGCB( MSGpkt );          break;                // Received whenever the device changes state in the network        case ZDO_STATE_CHANGE:          ZigbeeGateWay_NwkState = (devStates_t)(MSGpkt->hdr.status);          HalLedSet(HAL_LED_ALL,HAL_LED_MODE_ON);          HalLedBlink( HAL_LED_ALL, 6, 50, 80);          if ( //(ZigbeeGateWay_NwkState == DEV_ZB_COORD)||              (ZigbeeGateWay_NwkState == DEV_ROUTER)              || (ZigbeeGateWay_NwkState == DEV_END_DEVICE) )          {            // Start sending the periodic message in a regular interval.             osal_start_timerEx( ZigbeeGateWay_TaskID,                              ZIGBEEGATEWAY_SEND_PERIODIC_MSG_EVT,                              ZIGBEEGATEWAY_SEND_PERIODIC_MSG_TIMEOUT );          }          else          {            // Device is no longer in the network          }          break;        default:          break;      }      // Release the memory      osal_msg_deallocate( (uint8 *)MSGpkt );      // Next - if one is available      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( ZigbeeGateWay_TaskID );    }    // return unprocessed events    return (events ^ SYS_EVENT_MSG);  }  // Send a message out - This event is generated by a timer  //  (setup in ZigbeeGateWay_Init()).  if ( events & ZIGBEEGATEWAY_SEND_PERIODIC_MSG_EVT )  {    // Send the periodic message    ZigbeeGateWay_SendPeriodicMessage();    // Setup to send message again in normal period (+ a little jitter)    osal_start_timerEx( ZigbeeGateWay_TaskID, ZIGBEEGATEWAY_SEND_PERIODIC_MSG_EVT,        (ZIGBEEGATEWAY_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );    // return unprocessed events    return (events ^ ZIGBEEGATEWAY_SEND_PERIODIC_MSG_EVT);  }#if defined ( APP_UIP )       if ( events & UIP_PROCESS_EVT )  {    APP_uIP_Process();    return (events ^ UIP_PROCESS_EVT);  }#endif  // Discard unknown events  return 0;}

4.写消息处理函数

void ZigbeeGateWay_HandleUart(uint8 length, uint8* data){     HalLedSet(HAL_LED_2,HAL_LED_MODE_TOGGLE);        HalUARTWrite(HAL_UART_PORT,data,length);}

这里主要实现的回显功能,并且每收到一组字符串指示灯状态变化一下


测试

成功了

修改应用层之前应该先修改底层驱动,详见

Zigbee网关 Zstack增加串口功能1-修改底层驱动MT/MT_UART.c

http://blog.csdn.net/u010615629/article/details/49777767

0 0
原创粉丝点击