实验要求
实验源码
/*exam7coo.h*/ #ifndef EXAM7COO_H #define EXAM7COO_H #ifdef __cplusplus extern "C" {
#endif #include "ZComDef.h" #define WsdAPP_ENDPOINT 10 #define WsdAPP_PROFID 0x0F04 #define WsdAPP_DEVICEID 0x0001 #define WsdAPP_DEVICE_VERSION 0 #define WsdAPP_FLAGS 0 #define WsdAPP_MAX_CLUSTERS 1 #define WsdAPP_CLUSTERID 1 #define WsdAPP_SEND_MSG_TIMEOUT 2000 #define TIMEOUT_EVT_FLAG (1<<0) extern void WsdApp_Init( byte task_id ); extern UINT16 WsdApp_ProcessEvent( byte task_id, UINT16 events ); #ifdef __cplusplus
}
#endif
#endif /* WsdAPP_H */
/*exam7coo.c*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include <stdio.h>
#include "exam7coo.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 WsdApp_ClusterList[WsdAPP_MAX_CLUSTERS] =
{
WsdAPP_CLUSTERID
};
const SimpleDescriptionFormat_t WsdApp_SimpleDesc =
{
WsdAPP_ENDPOINT, // int Endpoint;
WsdAPP_PROFID, // uint16 AppProfId[2];
WsdAPP_DEVICEID, // uint16 AppDeviceId[2];
WsdAPP_DEVICE_VERSION, // int AppDevVer:4;
WsdAPP_FLAGS, // int AppFlags:4;
WsdAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)WsdApp_ClusterList, // byte *pAppInClusterList;
WsdAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)WsdApp_ClusterList // byte *pAppInClusterList;
};
endPointDesc_t WsdApp_epDesc;
byte WsdApp_TaskID;
devStates_t WsdApp_NwkState;
byte WsdApp_TransID; // This is the unique message ID (counter)
void WsdApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void WsdApp_Init( byte task_id )
{
halUARTCfg_t config;
WsdApp_TaskID = task_id;
WsdApp_NwkState = DEV_INIT;
WsdApp_TransID = 0;
// Fill out the endpoint description.
WsdApp_epDesc.endPoint = WsdAPP_ENDPOINT;
WsdApp_epDesc.task_id = &WsdApp_TaskID;
WsdApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&WsdApp_SimpleDesc;
WsdApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &WsdApp_epDesc );
config.baudRate = HAL_UART_BR_115200;
config.flowControl = FALSE;
//下面添加串口的配置代码HalUARTOpen
HalUARTOpen(HAL_UART_PORT_0,&config);
}
UINT16 WsdApp_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( WsdApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case AF_INCOMING_MSG_CMD://协调器收到无线数据
WsdApp_MessageMSGCB( MSGpkt );
break;
default:
break;
}
// Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt );
// Next
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( WsdApp_TaskID );
}
// return unprocessed events
return (events ^ SYS_EVENT_MSG);
}
// Discard unknown events
return 0;
}
void WsdApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
unsigned char buffer[21];
switch ( pkt->clusterId )
{
case WsdAPP_CLUSTERID:
osal_memcpy(buffer,pkt->cmd.Data,21);//把数据拷贝到buffer
if(osal_memcmp(buffer,"humi",4)==TRUE)
{
HalUARTWrite(HAL_UART_PORT_0,buffer,21);
}
break;
}
}
/*exam7end.c*/
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include <stdio.h>
#include "exam7coo.h"
#include "DebugTrace.h"
#include "OnBoard.h"
/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
const cId_t WsdApp_ClusterList[WsdAPP_MAX_CLUSTERS] =
{
WsdAPP_CLUSTERID
};
const SimpleDescriptionFormat_t WsdApp_SimpleDesc =
{
WsdAPP_ENDPOINT, // int Endpoint;
WsdAPP_PROFID, // uint16 AppProfId[2];
WsdAPP_DEVICEID, // uint16 AppDeviceId[2];
WsdAPP_DEVICE_VERSION, // int AppDevVer:4;
WsdAPP_FLAGS, // int AppFlags:4;
WsdAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)WsdApp_ClusterList, // byte *pAppInClusterList;
WsdAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)WsdApp_ClusterList // byte *pAppInClusterList;
};
endPointDesc_t WsdApp_epDesc;
byte WsdApp_TaskID;
devStates_t WsdApp_NwkState;
afAddrType_t WsdApp_DstAddr;
byte WsdApp_TransID; // This is the unique message ID (counter)
void WsdApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void Am2312_Start(void);
uint8 Am2312_Response(void);
unsigned char Read_SensorBit(void);
unsigned char Read_SensorData(void);
unsigned char Read_Sensor(uint16 *humi,uint16 *temp);
void AF_Send(unsigned char *buffer);
unsigned char Am2321_Data[5]={
0x00,0x00,0x00,0x00,0x00};
void WsdApp_Init( byte task_id )
{
WsdApp_TaskID = task_id;
WsdApp_NwkState = DEV_INIT;
WsdApp_TransID = 0;
WsdApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
WsdApp_DstAddr.endPoint = WsdAPP_ENDPOINT;
WsdApp_DstAddr.addr.shortAddr = 0;
// Fill out the endpoint description.
WsdApp_epDesc.endPoint = WsdAPP_ENDPOINT;
WsdApp_epDesc.task_id = &WsdApp_TaskID;
WsdApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&WsdApp_SimpleDesc;
WsdApp_epDesc.latencyReq = noLatencyReqs;
// Register the endpoint description with the AF
afRegister( &WsdApp_epDesc );
osal_start_timerEx( WsdApp_TaskID,
TIMEOUT_EVT_FLAG,
WsdAPP_SEND_MSG_TIMEOUT );
}
uint16 humi=0,temp=0;
uint8 inform[22];
UINT16 WsdApp_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( WsdApp_TaskID,
TIMEOUT_EVT_FLAG,
WsdAPP_SEND_MSG_TIMEOUT );
Read_Sensor(&humi,&temp);
sprintf(inform,"humi:%d%% temp:%dC\r\n\r\n",humi,temp);
AF_Send(inform);
return (events ^ TIMEOUT_EVT_FLAG);
}
// Discard unknown events
return 0;
}
//起始信号
void Am2312_Start(void)
{
P0SEL &= ~(1<<4);
P0DIR |= (1<<4);
P0_4 = 0;
MicroWait(1000);
P0_4 = 1;
MicroWait(30);
}
//响应信号
uint8 Am2312_Response(void)
{
P0DIR &= ~(1<<4);
P0INP &= ~(1<<4);
P2INP &= ~(1<<5);
uint8 cnt=0;
while (P0_4&&cnt<100)//DHT11会拉低40~80us
{
cnt++;
MicroWait(1);
};
if(cnt>=100)return 1;
else cnt=0;
while (!P0_4&&cnt<100)//DHT11拉低后会再次拉高40~80us
{
cnt++;
MicroWait(1);
};
if(cnt>=100)return 1;
return 0;
}
//读取一位数据
unsigned char Read_SensorBit(void)
{
uint8 cnt=0;
while(P0_4&&cnt<100)//等待变为低电平
{
cnt++;
MicroWait(1);
}
cnt=0;
while(!P0_4&&cnt<100)//等待变高电平
{
cnt++;
MicroWait(1);
}
MicroWait(40);//等待40us
if(P0_4)return 1;
else return 0;
}
//读取单个字节数据
unsigned char Read_SensorData(void)
{
uint8 data=0,i,cnt;
for(i=0;i<8;i++)
{
data <<= 1;
data |= Read_SensorBit();
}
return data;
}
//读取40位数据
unsigned char Read_Sensor(uint16 *humi,uint16 *temp)
{
uint8 buf[5];
uint8 i;
Am2312_Start();
if(Am2312_Response()==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf[i]=Read_SensorData();
}
if((uint8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=(buf[0]<<8) | buf[1];
*humi /= 10;
*temp=(buf[2]<<8) | buf[3];
*temp /= 10;
}
}else return 1;
return 0;
}
void AF_Send(unsigned char *buffer)
{
AF_DataRequest( &WsdApp_DstAddr, &WsdApp_epDesc,
WsdAPP_CLUSTERID,
(byte)osal_strlen(buffer) + 1,
buffer,
&WsdApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS );
}
实验思路
协调器:等待并接收终端发来的无线电数据,并通过串口打印
终端:每隔2s将温湿度传感器采集到的数据通过无线电发送给协调器
补充
printf(“humi:%d%%”,humi);
校验码=0x03+0x41+0x00+0xFA=13E
如果是象下面这种写法,用表达式代表校验码,并没有用一个8位的数据类型变量存着,编译器为了能存下这个值,它会申请16位的数据类型空间来存放13E,一个16位的值跟一个8位的值不管怎么相比(即使它们低8位的值相同),都不相同
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
加强制类型转换(或者用一个8位的数据类型变量存数据,会自动抛弃16位数据中的高8位,保留低8位)
if((uint8)(buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
实验现象
智能家居zigbee实验七(点击跳转)