无线传输数据类型
1.定义数据包结构类型
在.h头文件中
* FUNCTIONS定义数据包的数据结构
*/
typedef union h
{
unsigned char databuf[18];
struct RFRXBUF
{
unsigned char head[2];//头
unsigned char type[3];//设备类型
unsigned char myNWK[4];//节点网络地址
unsigned char pNWK[4];//父节点网络地址
unsigned char value[4];//传感器数据
unsigned char tail ;//尾
}BUF ;
}RFTX;
2.在事件函数中添加调用函数
if ( events & SEND_DATA_EVENT )
{
sendTemp();
sendVdd();
osal_start_timerEx( GenericApp_TaskID, SEND_DATA_EVENT,5000);
return (events ^ SEND_DATA_EVENT);
}
3.温度调用函数(例子)
void sendTemp(void)
{
RFTX rftx;
uint16 tempvalue;
uint16 nwk;
tempvalue = readTemp();从函数readTemp中获取温度值
rftx.BUF.value[0]='W';
rftx.BUF.value[1]=tempvalue/10+'0';
rftx.BUF.value[2]=tempvalue%10+'0';
rftx.BUF.value[3]='*';
osal_memcpy(rftx.BUF.head, "&&", 2);
if ( //(SampleApp_NwkState == DEV_ZB_COORD) ||
(GenericApp_NwkState == DEV_ROUTER)
|| (GenericApp_NwkState == DEV_END_DEVICE) )
{
osal_memcpy(rftx.BUF.type, "END", 3);
}
nwk=NLME_GetShortAddr();
To_string(rftx.BUF.myNWK,(uint8*)&nwk,2);
nwk=NLME_GetCoordShortAddr();
To_string(rftx.BUF.pNWK,(uint8*)&nwk,2);
rftx.BUF.tail='&';
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,
18,
(uint8*)&rftx,
&GenericApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS );
}
4.将二进制转换为十六进制,该段是显示节点
void To_string(uint8 *dest,char *src,uint8 length)
{
uint8 *xad;
uint8 i=0;
uint8 ch;
xad =src + length-1;
for(i=0;i<length;i++,xad--)
{
ch = (*xad >> 4)&0x0F;
dest[i<<1] = ch +((ch < 10)?'0':'7');
ch = *xad&0x0F;
dest[(i<<1)+1] = ch +((ch < 10)?'0':'7');
}
}
5.CC2530自带的温度传感器和电压传感器程序
#include "Sensor.h"
#include <ioCC2530.h>
#define ADC_REF_115V 0X00
#define ADC_DEC_256 0X20
#define ADC_CHN_TEMP 0X0e
#define ADC_DEC_064 0X00
#define ADC_CHN_VDD3 0X0f
//cc2530自带的温度传感器的检测函数
int8 readTemp(void)
{
static uint16 reference_voltage;
static uint8 bCalibrate = TRUE;
unsigned char tmpADCCON3 = ADCCON3;
uint16 value;
int8 temp;
ATEST = 0x01;
TR0 |= 0x01;
ADCIF = 0;
ADCCON3 = (ADC_REF_115V | ADC_DEC_256 | ADC_CHN_TEMP);
while(!ADCIF);
ADCIF =0;
value = ADCL;
value |= ((uint16)ADCH)<<8;
value >>= 4;
ADCCON3 = tmpADCCON3;
if(bCalibrate)
{
reference_voltage=value;
bCalibrate = FALSE;
}
temp = 22 + ((value - reference_voltage)/4);
return temp;
}
unsigned int getVddvalue(void)
{
unsigned int value;
unsigned char tmpADCCON3 = ADCCON3;
ADCIF = 0;
ADCCON3 = (ADC_REF_115V | ADC_DEC_064 | ADC_CHN_VDD3);
while(!ADCIF);
value = ADCH;
ADCCON3 = tmpADCCON3;
return(value);
}
- 头文件
#ifndef SENSOR_H
#define SENSOR_H
#include <hal_types.h>
extern int8 readTemp(void);
extern unsigned int getVddvalue(void);
#endif