资源描述
参考文档:xf zigbee 串口透明传输SampleApp 例程实验增加一个事件十六进制转字符函数【摘】数据的发送,广播、组播、点对点Z-stack1.4.3-1.2.1 SampleApp DB编译选项CoordinatorDBCC2430DBHAL_UARTZDO_COORDINATOREndDeviceDBCC2430DBNWK_AUTO_POLLHAL_UART修改地方 hal_board_cfg.h/*Set to TRUE enable UART usage,FALSE disable it*/#ifndef HAL_UART#if(defined ZAPP_P1)|(defined ZAPP_P2)|(defined ZTOOL_P1)|(defined ZTOOL_P2)#define HAL_UART TRUE#else#define HAL_UART TRUE#endif/*ZAPP,ZTOOL*/#endif/*HAL_UART*/#if HAL_UART#define HAL_UART_0_ENABLETRUE#define HAL_UART_1_ENABLEFALSE修改地方 SampleApp.h#define UART_RX_CB_EVT0 x0002/添加串口处理事件修改地方 SampleApp.c串口配置void SampleApp_Init(uint8 task_id)/UART ConfigurationhalUARTCfg_t uartConfig;uartConfig.configured=TRUE;uartConfig.baudRate=HAL_UART_BR_38400;uartConfig.flowControl=FALSE;uartConfig.flowControlThreshold=1;uartConfig.rx.maxBufSize=255;uartConfig.tx.maxBufSize=255;uartConfig.idleTimeout=1;uartConfig.intEnable=TRUE;uartConfig.callBackFunc=rxCB;HalUARTOpen(HAL_UART_PORT_0,&uartConfig);回调函数 rxCBstatic void rxCB(uint8 port,uint8 event)/uint8rxlen;/接收数据长度/uint8*databuf;/接收数据块指针extern uint8 SampleApp_TaskID;uint16 short_ddr;uint8 short_ddr_H;uint8 short_ddr_L;uint8*pointer1;uint8 word_buffer10;uint8*pointer9;uint8 str_enter=n;pointer9=&str_enter0;short_ddr=NLME_GetShortAddr();short_ddr_H=(uint8)(short_ddr&0 xff00)8);short_ddr_L=(uint8)short_ddr;rxlen=Hal_UART_RxBufLen(HAL_UART_PORT_0);/接收缓冲区数据长度,字节为单位databuf=osal_mem_alloc(rxlen+1+2);/多分配 3 字节,分配如下databuf0=rxlen;/一字节存放数据长度databuf1=short_ddr_H;/一字节存放源地址高 8 位databuf2=short_ddr_L;/一字节存放源地址低 8 位databufrxlen+1=n;/一字节存放换行符HalUARTRead(HAL_UART_PORT_0,databuf+3,rxlen);/读接收缓冲区数据到内存 databuf+3#if defined(ZDO_COORDINATOR)word_buffer0=0;word_buffer1=0;word_buffer2=0;word_buffer3=0;#elseword_buffer0=7;word_buffer1=9;word_buffer2=6;word_buffer3=F;#endifword_buffer4=:;word_buffer5=databuf0/100+48;word_buffer6=(databuf0%100)/10+48;word_buffer7=databuf0%10+48;word_buffer8=n;pointer1=word_buffer;/HalUARTWrite()写入串口正确说明数据已经正确地存储在 databuf 中!HalUARTWrite(HAL_UART_PORT_0,pointer1,9);HalUARTWrite(HAL_UART_PORT_0,databuf+1,rxlen+1);/把数据送串口输出HalUARTWrite(0,pointer9,1);HalUARTWrite(0,pointer9,1);if(!rxlen)osal_mem_free(databuf);/释放内存osal_set_event(SampleApp_TaskID,UART_RX_CB_EVT);自定义发送数据函数void SampleApp_SPI_SendData(uint8*buf,uint8 len)/此处点对点传输SampleApp_SPI_SendData_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;SampleApp_SPI_SendData_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;#if defined(ZDO_COORDINATOR)SampleApp_SPI_SendData_DstAddr.addr.shortAddr=0 x796F;#elseSampleApp_SPI_SendData_DstAddr.addr.shortAddr=0 x0000;#endifif(AF_DataRequest(&SampleApp_SPI_SendData_DstAddr,(endPointDesc_t*)&SampleApp_epDesc,SAMPLEAPP_PERIODIC_CLUSTERID,len,buf,&SampleApp_TransID,0,AF_DEFAULT_RADIUS)=afStatus_SUCCESS)osal_mem_free(databuf);/必须释放内存,不然造成溢出!elseosal_mem_free(databuf);变量定义afAddrType_t SampleApp_SPI_SendData_DstAddr;uint8rxlen;/接收数据长度uint8*databuf;/接收数据块指针函数声明void SampleApp_SPI_SendData(uint8*buf,uint8 len);uint8 hextoword1(uint8 t);/十六进制转字符uint8 hextoword2(uint8 t);static void rxCB(uint8 port,uint8 event);其他void SampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)uint16 flashTime;uint16 short_ddr;uint8*pointer1;uint8*pointer2;uint8*pointer3;uint8*pointer4;uint8*pointer5;uint8*pointer6;uint8*pointer7;uint8*pointer8;uint8*pointer9;uint8 str_1=Source address:;uint8 str_2=Destination address:;uint8 str_3=Data length:;uint8 str_4=Data:;uint8 str_5=n;pointer1=&str_10;pointer2=&str_20;pointer3=&str_30;pointer4=&str_40;pointer9=&str_50;uint8 Src_short_ddr_H;uint8 Src_short_ddr_L;uint8 Des_short_ddr_H;uint8 Des_short_ddr_L;uint8 word_buffer4;uint8 Src_shortaddr7;uint8 Des_shortaddr7;switch(pkt-clusterId)case SAMPLEAPP_PERIODIC_CLUSTERID:HalLedBlink(HAL_LED_4,4,50,(1000/4);pointer5=&(pkt-cmd.Data3);/pointer5:具体数据首地址word_buffer0=(pkt-cmd.Data0)/100+48;word_buffer1=(pkt-cmd.Data0)%100)/10+48;word_buffer2=(pkt-cmd.Data0)%10+48;word_buffer3=n;pointer6=word_buffer;/pointer6:数据长度Src_short_ddr_H=pkt-cmd.Data1;Src_short_ddr_L=pkt-cmd.Data2;Src_shortaddr0=48;Src_shortaddr1=120;Src_shortaddr2=hextoword1(Src_short_ddr_H);Src_shortaddr3=hextoword2(Src_short_ddr_H);Src_shortaddr4=hextoword1(Src_short_ddr_L);Src_shortaddr5=hextoword2(Src_short_ddr_L);Src_shortaddr6=n;pointer7=&Src_shortaddr0;/pointer7:源地址short_ddr=NLME_GetShortAddr();Des_short_ddr_H=(uint8)(short_ddr&0 xff00)8);Des_short_ddr_L=(uint8)short_ddr;Des_shortaddr0=48;Des_shortaddr1=120;Des_shortaddr2=hextoword1(Des_short_ddr_H);Des_shortaddr3=hextoword2(Des_short_ddr_H);Des_shortaddr4=hextoword1(Des_short_ddr_L);Des_shortaddr5=hextoword2(Des_short_ddr_L);Des_shortaddr6=n;pointer8=&Des_shortaddr0;/pointer8:目的地址HalUARTWrite(0,pointer1,15);/源地址HalUARTWrite(0,pointer7,7);HalUARTWrite(0,pointer2,20);/目的地址HalUARTWrite(0,pointer8,7);HalUARTWrite(0,pointer3,12);/数据长度HalUARTWrite(0,pointer6,4);HalUARTWrite(0,pointer4,5);/具体数据HalUARTWrite(0,pointer5,pkt-cmd.Data0);HalUARTWrite(0,pointer9,1);/换行符HalUARTWrite(0,pointer9,1);break;case SAMPLEAPP_FLASH_CLUSTERID:flashTime=BUILD_UINT16(pkt-cmd.Data1,pkt-cmd.Data2);HalLedBlink(HAL_LED_4,4,50,(flashTime/4);break;uint16 SampleApp_ProcessEvent(uint8 task_id,uint16 events)afIncomingMSGPacket_t*MSGpkt;uint16 short_ddr;uint8 yy1;uint8 yy2;uint8 str_1=my short address is:;#if defined(ZDO_COORDINATOR)uint8 str_2=build the network successfully;#elseuint8 str_2=join the network successfully;#endifuint8 str_3=n;uint8 shortaddr7;uint8*pointer1;uint8*pointer2;uint8*pointer3;uint8*pointer4;if(events&SYS_EVENT_MSG)MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);while(MSGpkt)switch(MSGpkt-hdr.event)/Received whenever the device changes state in the networkcase ZDO_STATE_CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.status);if(SampleApp_NwkState=DEV_ZB_COORD)|(SampleApp_NwkState=DEV_ROUTER)|(SampleApp_NwkState=DEV_END_DEVICE)short_ddr=NLME_GetShortAddr();yy1=(uint8)(short_ddr&0 xff00)8);yy2=(uint8)short_ddr;shortaddr0=48;shortaddr1=120;shortaddr2=hextoword1(yy1);shortaddr3=hextoword2(yy1);shortaddr4=hextoword1(yy2);shortaddr5=hextoword2(yy2);shortaddr6=n;pointer1=&shortaddr0;pointer2=&str_10;pointer3=&str_20;pointer4=&str_30;HalUARTWrite(0,pointer4,1);HalUARTWrite(0,pointer3,29);HalUARTWrite(0,pointer4,1);HalUARTWrite(0,pointer2,20);HalUARTWrite(0,pointer1,7);HalUARTWrite(0,pointer4,1);/Start sending the periodic message inaregular interval./osal_start_timerEx(SampleApp_TaskID,/SAMPLEAPP_SEND_PERIODIC_MSG_EVT,/SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);else/Device is no longer in the networkbreak;if(events&UART_RX_CB_EVT)/串口数据处理SampleApp_SPI_SendData(databuf,rxlen+1+2);return(events UART_RX_CB_EVT);每次发送,小灯闪 4 下
展开阅读全文