问题出在这一段代码中
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 AFafRegister( &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 ); //清缓存// NextMSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );}// return unprocessed eventsreturn (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); }//发送函数
yuetian song:
回复 VV:
OK,谢谢。下回我会注意图片的