文章目录[隐藏]
实验要求
实验源码
/*exam6coo.h*/
#ifndef FIRECOORDINATOR_H
#define FIRECOORDINATOR_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "ZComDef.h"
#define FireAPP_ENDPOINT 10
#define FireAPP_PROFID 0x0F04
#define FireAPP_DEVICEID 0x0001
#define FireAPP_DEVICE_VERSION 0
#define FireAPP_FLAGS 0
#define FireAPP_MAX_CLUSTERS 1
#define FireAPP_CLUSTERID 1
#define FireAPP_SEND_MSG_TIMEOUT 1000
#define TIMEOUT_EVT_FLAG (1<<0)
extern void FireApp_Init( byte task_id );
extern UINT16 FireApp_ProcessEvent( byte task_id, UINT16 events );
#ifdef __cplusplus
}
#endif
#endif /* FireAPP_H */
/*exam6coo.c*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include <stdio.h>
#include "FireCoordinator.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
#include "OnBoard.h"
#endif
/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
const cId_t FireApp_ClusterList[FireAPP_MAX_CLUSTERS] =
{
FireAPP_CLUSTERID
};
const SimpleDescriptionFormat_t FireApp_SimpleDesc =
{
FireAPP_ENDPOINT, // int Endpoint;
FireAPP_PROFID, // uint16 AppProfId[2];
FireAPP_DEVICEID, // uint16 AppDeviceId[2];
FireAPP_DEVICE_VERSION, // int AppDevVer:4;
FireAPP_FLAGS, // int AppFlags:4;
FireAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)FireApp_ClusterList, // byte *pAppInClusterList;
FireAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)FireApp_ClusterList // byte *pAppInClusterList;
};
endPointDesc_t FireApp_epDesc;
byte FireApp_TaskID;
devStates_t FireApp_NwkState;
byte FireApp_TransID; // This is the unique message ID (counter)
void FireApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void FireApp_Init( byte task_id )
{
halUARTCfg_t config;
FireApp_TaskID = task_id;
FireApp_NwkState = DEV_INIT;
FireApp_TransID = 0;
// Fill out the endpoint description.
FireApp_epDesc.endPoint = FireAPP_ENDPOINT;
FireApp_epDesc.task_id = &FireApp_TaskID;
FireApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&FireApp_SimpleDesc;
FireApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &FireApp_epDesc );
config.baudRate = HAL_UART_BR_115200;
config.flowControl = FALSE;
//下面添加串口的配置代码HalUARTOpen
HalUARTOpen(HAL_UART_PORT_0,&config);
}
UINT16 FireApp_ProcessEvent( byte task_id, UINT16 events )
{
afIncomingMSGPacket_t *MSGpkt;
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( FireApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case AF_INCOMING_MSG_CMD://协调器收到无线数据
FireApp_MessageMSGCB( MSGpkt );
break;
default:
break;
}
// Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt );
// Next
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( FireApp_TaskID );
}
// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}
// Discard unknown events
return 0;
}
void FireApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
unsigned char buffer[10];
switch ( pkt->clusterId )
{
case FireAPP_CLUSTERID:
osal_memcpy(buffer,pkt->cmd.Data,10);//把数据拷贝到buffer
if(osal_memcmp(buffer,"LEDON",5)==TRUE)
{
HalLedSet (HAL_LED_2, HAL_LED_MODE_ON);
HalUARTWrite(HAL_UART_PORT_0,buffer,7);
}
if(osal_memcmp(buffer,"LEDOFF",6)==TRUE)
{
HalLedSet (HAL_LED_2, HAL_LED_MODE_OFF);
HalUARTWrite(HAL_UART_PORT_0,buffer,8);
}
break;
}
}
/*exam6end.c*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include <stdio.h>
#include "FireCoordinator.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
#include "OnBoard.h"
#endif
/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
const cId_t FireApp_ClusterList[FireAPP_MAX_CLUSTERS] =
{
FireAPP_CLUSTERID
};
const SimpleDescriptionFormat_t FireApp_SimpleDesc =
{
FireAPP_ENDPOINT, // int Endpoint;
FireAPP_PROFID, // uint16 AppProfId[2];
FireAPP_DEVICEID, // uint16 AppDeviceId[2];
FireAPP_DEVICE_VERSION, // int AppDevVer:4;
FireAPP_FLAGS, // int AppFlags:4;
FireAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)FireApp_ClusterList, // byte *pAppInClusterList;
FireAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)FireApp_ClusterList // byte *pAppInClusterList;
};
endPointDesc_t FireApp_epDesc;
byte FireApp_TaskID;
devStates_t FireApp_NwkState;
afAddrType_t FireApp_DstAddr;
byte FireApp_TransID; // This is the unique message ID (counter)
void FireApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void AF_Send(unsigned char *buffer);
void FireApp_Init( byte task_id )
{
FireApp_TaskID = task_id;
FireApp_NwkState = DEV_INIT;
FireApp_TransID = 0;
FireApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
FireApp_DstAddr.endPoint = FireAPP_ENDPOINT;
FireApp_DstAddr.addr.shortAddr = 0;
// Fill out the endpoint description.
FireApp_epDesc.endPoint = FireAPP_ENDPOINT;
FireApp_epDesc.task_id = &FireApp_TaskID;
FireApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&FireApp_SimpleDesc;
FireApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &FireApp_epDesc );
P0SEL &= ~(1<<7);
P0DIR &= ~(1<<7);
P0INP &= ~(1<<7);
P2INP &= ~(1<<5);
osal_start_timerEx( FireApp_TaskID,
TIMEOUT_EVT_FLAG,
FireAPP_SEND_MSG_TIMEOUT );
}
uint8 Led_State;
UINT16 FireApp_ProcessEvent( byte task_id, UINT16 events )
{
(void)task_id; // Intentionally unreferenced parameter
if ( events & SYS_EVENT_MSG )
{
// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}
if ( events & TIMEOUT_EVT_FLAG )
{
osal_start_timerEx( FireApp_TaskID,
TIMEOUT_EVT_FLAG,
FireAPP_SEND_MSG_TIMEOUT );
if(P0_7)
{
AF_Send("LEDOFF\r\n");
HalLedSet (HAL_LED_2, HAL_LED_MODE_OFF);
}
else
{
AF_Send("LEDON\r\n");
HalLedSet (HAL_LED_2, HAL_LED_MODE_ON);
}
return (events ^ TIMEOUT_EVT_FLAG);
}
// Discard unknown events
return 0;
}
void AF_Send(unsigned char *buffer)
{
AF_DataRequest( &FireApp_DstAddr, &FireApp_epDesc,
FireAPP_CLUSTERID,
(byte)osal_strlen(buffer) + 1,
buffer,
&FireApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS );
}
实验思路
协调器:等待接收终端发来的数据,如果是LEDON就点亮本节点的灯,同时向串口写LEDON,如果是LEDOFF就关闭本节点的灯,同时向串口写LEDOFF
终端:利用定时器每隔1s向通过无线电向协调器发送灯的状态信息,当火焰传感器检测到火焰时,灯的状态为亮,否则为灭
补充
当通过查阅芯片数据手册并配置好引脚为通用I/O,输入,上拉模式后,可直接通过sfr特殊功能寄存器P0_7来判断该引脚上的电平信号
实验现象
版权声明:本文为CSDN博主「极客糟珀—肌发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_49098053/article/details/121248990
暂无评论