微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 循环事件中用睡眠定时函数

循环事件中用睡眠定时函数

时间:10-02 整理:3721RD 点击:

问题出在这一段代码中

if(events & SEND_DATA_EVENT) //发送事件
  {
    int i=0;
    for(i;i<3;i++) halSleep(1000);
    GenericApp_SendTheMessage();//发送函数
    osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,2000); //每个6s,重复这次事件
    return(events ^ SEND_DATA_EVENT);
  }
这里会导致终端连续发送两段数据,如

后面带的‘dht110000’这个尾巴,我完全不知道是怎么冒出来的,前面的数据是我需要的,但这尾巴不知从哪而降的
感谢各位大大,观看
最后附上终端代码
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>

#include "Coordinator.h"
#include "DebugTrace.h"

#include "OnBoard.h"

/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
#include "aps_groups.h"
#include "DHT11.h"
#define SHOW_INFO_EVENT 0x01
#define SEND_DATA_EVENT 0x0001

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
};
const SimpleDescriptionFormat_t GenericApp_SimpleDesc = //简单节点描述符
{
  GENERICAPP_ENDPOINT,             
  GENERICAPP_PROFID,               
  GENERICAPP_DEVICEID,             
  GENERICAPP_DEVICE_VERSION,       
  GENERICAPP_FLAGS,
  0,
  (cId_t*)NULL,
  GENERICAPP_MAX_CLUSTERS,
  (cId_t *)GenericApp_ClusterList
};

endPointDesc_t GenericApp_epDesc; //本节点的函数
byte GenericApp_TaskID;
byte GenericApp_TransID;
devStates_t GenericApp_NwkState;
void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pckt);
void GenericApp_SendTheMessage(void);
  

void GenericApp_Init( byte task_id ) //节点的初始化
{
  
  GenericApp_TaskID = task_id;
  GenericApp_NwkState = DEV_INIT;
  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;

  // Register the endpoint description with the AF
  afRegister( &GenericApp_epDesc );
}
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ) //事件处理机制
{
  
  afIncomingMSGPacket_t *MSGpkt;
  if ( events & SYS_EVENT_MSG )
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZDO_STATE_CHANGE:  //当节点网络状态发生改变时,触发此事件
          GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status); //获取节点当前状态,MSGpkt->hdr.status这个涉及到协议栈底层
          if (GenericApp_NwkState == DEV_END_DEVICE) //当节点状态是终端时,触发下列处理机制
          {
            osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);// 设置一个新的事件
          }
          break;
      default:
          break;
      }
      osal_msg_deallocate( (uint8 *)MSGpkt ); //清缓存

      // Next
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
    }

    // return unprocessed events
    return (events ^ SYS_EVENT_MSG);
  }
  if(events & SEND_DATA_EVENT) //发送事件
  {
    int i=0;
    for(i;i<3;i++)
      halSleep(1000);
    GenericApp_SendTheMessage();//发送函数
    osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,2000); //每个6s,重复这次事件
    return(events ^ SEND_DATA_EVENT);
  }
 
  return 0;
}

void GenericApp_SendTheMessage(void) //发送函数,包括读取DHT11的数据,发送数据
{
  char temp[2],humidity[2],strTemp[10];
  DHT11();
  temp[0] = wendu_shi+0x30;
  temp[1] = wendu_ge+0x30;
  humidity[0] = shidu_shi+0x30;
  humidity[1] = shidu_ge+0x30; //上面是读取事件,以及定义一些变量
  osal_memcpy(strTemp,"dht11",5);
  osal_memcpy(&strTemp[5], temp, 2); 
  osal_memcpy(&strTemp[7], humidity, 2);//数据整合
  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,
                 10,
                 (uint8*)strTemp,
                 &GenericApp_TransID,
                 AF_DISCV_ROUTE,
                 AF_DEFAULT_RADIUS);
}//发送函数
 

你好,不建议在程序直接添加halSleep做休眠。

协议栈会自动调度实现休眠,可以通过定时器进行定时唤醒。

OK,谢谢。下回我会注意图片的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top