ZigBee学习(2)————串口应用的扩展和温度

目录

利用ZigBee协议栈进行数据传输对的目标,在无线传感器网络中,大多数传感节点负责数据的采集工作,如温度,湿度,压力,烟雾浓度等信息。以下通过例子展示传感器数据的采集,传输与现实基本流程。


协调器建立ZigBee网络,终端节点自动加入该网络中,然后终端节点周期性地采集温度数据并将其发送给协调器,协调器收到温度数据后,通过串口将其输出到用户PC机。

 

协调器编程:

//Coordinator.h
typedef union h
{
  uint8 TEMP[4];
  struct RFRXBUF
  {
    unsigned char Head;                     //命令头
    unsigned char value[2];                 //温度数据
    unsigned char Tail;                     //命令尾
  }BUF;
}TEMPERATURE;

此时实验的数据包格式如下:

通过一个共用体来表示整个数据包,里面有两个成员变量,一个是数组TEMP,该数组有4个元素;另一个是结构体,该结构体具体实现了数据包的数据头,温度数据,数据尾。

 

//Coordinator.c
void GenericApp_Init( byte task_id )
{
  halUARTCfg_t uartConfig;
  GenericApp_TaskID = task_id;
  GenericApp_TransID = 0;
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  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;           //此时不需要回调函数了,设置为NULL
  HalUARTOpen(0, &uartConfig);
}

初始化系统和串口函数

 

//Coordinator.c
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  unsigned char buffer[2]={0x0A , 0x0D};     //定义温度的位数字节,回车换行符的ASCII码
  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;
  }
}

数组buffer中存储的是回车换行符的ASCII码,主要是为了向串口发送一个回车换行符号;定义一个TEMPERATURE类型的变量用于存储接收到的数据;使用osal_memcpy()函数,并将接收到的数据拷贝到temperature中;通过HalUARTWrite()函数向串口发送数据。

 

终端节点编程:

CC2530单片机内部有温度传感器,步骤如下:

1)使能温度传感器;

2)连接温度传感器到ADC;

3)初始化ADC,确定参考电压,分辨率等;

4)启动ADC读取温度数据

//Enddevice.c
void GenericApp_SendTheMessage( void )
{
  //unsigned char theMessageData[10] = "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;                        //协调器网络地址
  AF_DataRequest( &my_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       sizeof(temperature),
                       (uint8 *)&temperature,
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, 
                       AF_DEFAULT_RADIUS ) ;
}

使用TEMPERATURE类型的变量temperature,使得发送和接收双方共同使用数据包格式;填充命令头,读取温度数据,将数据转换为ASCII码,填充命令尾;初始化目的地址以及发送格式,使用单播发送,协调器的网络地址是0x0000;调用数据发送函数AF_DataRequest()进行数据发送

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值