您的位置:首页 > 移动开发

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

2015-11-11 10:03 585 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: