ZigBee学习五 无线温度检测

1)修改公用头文件GenericApp.h

typedef union h
{
  uint8 TEMP[4];
  struct RFRXBUF
  {
    unsigned char Head;
    unsigned char value[2];
    unsigned char Tail;
  }BUF;
}TEMPERATURE;

2)协调器编程

协调器编程时,只需要修改一下消息处理函数GenericApp_MessageMSGCB()即可:

修改coordinator.c文件

byte GenericApp_TransID; // This is the unique message ID (counter)

afAddrType_t GenericApp_DstAddr;

//unsigned char uartbuf[128];
/*********************************************************************
* LOCAL FUNCTIONS
*/
static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
static void GenericApp_HandleKeys( byte shift, byte keys );
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
static void GenericApp_SendTheMessage( void );

//static void rxCB(uint8 port,uint8 event);

void GenericApp_Init( uint8 task_id )
{
  halUARTCfg_t uartConfig;
  GenericApp_TaskID = task_id;
  GenericApp_NwkState = DEV_INIT;
  GenericApp_TransID = 0;

  ... ...

  GenericApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;

  afRegister( &GenericApp_epDesc );

  uartConfig.configured   = TRUE;
  uartConfig.baudRate    = HAL_UART_BR_115200;
  uartConfig.flowControl    = FALSE;
  uartConfig.callBackFunc  = NULL;

  HalUARTOpen(0,&uartConfig);

}

//该函数是一个空函数。因为本实验并没有进行事件处理,所有不需要任何代码

uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )
{

... ...

  switch ( MSGpkt->hdr.event )
  {
    case ZDO_CB_MSG:
      break;

    case KEY_CHANGE:
      break;

    case AF_DATA_CONFIRM_CMD:

      break;

    case AF_INCOMING_MSG_CMD:

      GenericApp_MessageMSGCB( MSGpkt );
      break;

    case ZDO_STATE_CHANGE:
      break;

    default:
      break;
  }

... ...

}

/*

static void rxCB(uint8 port,uint8 event)
{
  HalUARTRead(0,uartbuf,16);  //读取数据并存放到uartbuf数组中
  if(osal_memcmp(uartbuf,"www.wlwmaker.com",16)) //使用osal_memcmp()函数判断接收到的数据是否是字符串"www.wlwmaker.com",如果是,执行{}
  {
    HalUARTWrite(0,uartbuf,16); //调用HalUARTWrite()函数将接收到的字符输出到串口
  }
}

*/

static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{

    unsigned char buffer[2] = {0x0A,0x0D};
    TEMPERATURE temperature;

    switch ( pkt->clusterId )
    {

      case GENERICAPP_CLUSTERID:
        osal_memcpy(&temperature,pkt->cmd.Data,sizeof(temperature));
        HalUARTWrite(0,(uint8 *)&temperature,sizeof(temperature));
        HalUARTWrite(0,buffer,2);
        break;

    }

}

3)终端节点编程

建立驱动文件Sensor.h和Sensor.c

Sensor.h文件

#ifndef SENSOR_H
#define SENSOR_H
#include <hal_types.h>

extern int8 readTemp(void);

#endif

Sensor.c文件

#include "Sensor.h"
#include <ioCC2530.h>

#define HAL_ADC_REF_115V 0x00
#define HAL_ADC_DEC_256 0x20
#define HAL_ADC_CHN_TEMP 0x0e

int8 readTemp(void)
{
  static uint16 reference_voltage;
  static uint8 bCalibrate = TRUE;
  uint16 value;
  int8 temp;

  ATEST =0x01;
  TR0 |= 0x01;
  ADCIF = 0;
  ADCCON3 = (HAL_ADC_REF_115V|HAL_ADC_DEC_256|HAL_ADC_CHN_TEMP);
  while(!ADCIF);

  ADCIF = 0;
  value = ADCL;
  value |= ((uint16)ADCH)<<8;

  value >>=4;
  if(bCalibrate)
  {
    reference_voltage = value;
    bCalibrate = FALSE;
  }
  temp = 22 + ((value - reference_voltage)/4);
  return temp;
}

修改enddevice.c文件

只需修改消息发送函数就行了

static void GenericApp_SendTheMessage( void )
{
  //char theMessageData[] = "EndDevice";
  uint8 tvalue;
  TEMPERATURE temperature;
  temperature.BUF.Head = '&';
  tvalue = readTemp();
  temperature.BUF.value[0] = tvalue /10 +'0';
  temperature.BUF.value[1] = tvalue %10 +'0';
  temperature.BUF.Tail = 'C';

  afAddrType_t my_DstAddr;
  my_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//单播发送
  my_DstAddr.endPoint = GENERICAPP_ENDPOINT; //目的端口号
  my_DstAddr.addr.shortAddr = 0x0000; //协调器网络地址

  if ( AF_DataRequest( &my_DstAddr, &GenericApp_epDesc,
    GENERICAPP_CLUSTERID,
    sizeof(temperature ),
    (byte *)&temperature,
    &GenericApp_TransID,
    AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
    {
      // Successfully requested to be sent.
      HalLedBlink(HAL_LED_1,0,50,500);
    }else
    {
      // Error occurred in request to send.
    }
}

最新文章

  1. axure快速原型设计工具
  2. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择
  3. 【js】JSON.stringify 语法实例讲解
  4. Java-UDP Socket编程
  5. [ CodeVS冲杯之路 ] P3955
  6. 远程连接数据库(通过pgAdmin)
  7. c# 捕捉键盘按键
  8. HDU 4009 不定根最小树形图
  9. HDOJ-ACM1008(JAVA)
  10. 图像储存容器Mat[OpenCV 笔记11]
  11. 面试:如何找出字符串的字典序全排列的第N种
  12. 再探Delphi2010 Class的构造和析构顺序
  13. linux为什么要使用CentOS开发?
  14. 【iCore4 双核心板_FPGA】例程十:FSMC总线通信实验——复用地址模式
  15. Unity 3D接入ShareSDK流程2
  16. 【Detection】R-FCN: Object Detection via Region-based Fully Convolutional Networks论文分析
  17. SQL Server(MSSQLSERVER)启动失败,提示“请求失败或服务未及时响应
  18. Eclipse下Java Build Path下Libraies中添加 Maven dependencies 失败解决方案
  19. JavaScript的运算符
  20. 简单label控件 自制

热门文章

  1. RHEL7 本地yum源配置
  2. 将bat批处理文件注册成windows服务
  3. SqlServer2000事件探测器的使用
  4. PHP implode() 函数
  5. Bootstrap 提示工具(Tooltip)插件的事件
  6. eclipse部署web项目至本地的tomcat但在webapps中找不到问题
  7. Java基础面试操作题: 获取 1-20 之间的随机数,共计 20 个,要求不能重复 获取 1-20 之间的随机数,共计 10 个,要求不能重
  8. 揭密 Vue 的双向绑定
  9. C盘扩容 更改C盘大小
  10. 如何修改iframe内的页面的元素的样式。。。。