1.下边这个程序是router中的程序
PRIVATE void vSendData(void)
{
const uint16 SensornameNO = 1
AF_Transaction_s asTransaction[1];
//发送到公共节点的信息格式
asTransaction[0].u8SequenceNum = u8AfGetTransactionSequence(TRUE);
asTransaction[0].uFrame.sMsg.u8TransactionDataLen = 8;
asTransaction[0].uFrame.sMsg.au8TransactionData[0] = sBattSensor.u16Reading;
asTransaction[0].uFrame.sMsg.au8TransactionData[1] = sBattSensor.u16Reading >> 8;
asTransaction[0].uFrame.sMsg.au8TransactionData[2] = sTempHumiditySensor.u16TempReading;
asTransaction[0].uFrame.sMsg.au8TransactionData[3] = sTempHumiditySensor.u16TempReading >> 8;
asTransaction[0].uFrame.sMsg.au8TransactionData[4] = sTempHumiditySensor.u16HumidReading;
asTransaction[0].uFrame.sMsg.au8TransactionData[5] = sTempHumiditySensor.u16HumidReading >> 8;
asTransaction[0].uFrame.sMsg.au8TransactionData[6] = SensornameNO;
asTransaction[0].uFrame.sMsg.au8TransactionData[7] = SensornameNO >> 8;
(void)afdeDataRequest(APS_ADDRMODE_SHORT, /* Address type */
0x0000, /* Destination address协调器地址 */
WSN_DATA_SINK_ENDPOINT, /* destination endpoint */
WSN_DATA_SOURCE_ENDPOINT, /* Source endpoint */
WSN_PROFILE_ID, /* Profile ID */
WSN_CID_SENSOR_READINGS, /* Cluster ID */
AF_MSG, /* Frame type */
1, /* Transactions */
asTransaction, /* Transaction data发送数据 */
APS_TXOPTION_NONE, /* Transmit options */
SUPPRESS_ROUTE_DISCOVERY, /* Route discovery mode */
0); /* Radius count */
}
鉴于只能发int型的数据,没办法只好从HtsDriver.c中的u16HTSreadTempResult(void)函数中 保留一位精度。
PUBLIC uint16 u16HTSreadTempResult(void)
{
uint32 u32Result;
u32Result = (uint32)u16ReadMeasurementResult();
u32Result = u32Result * 410- 405500;//此处比原来扩大十倍,保留了一位精度
return (uint16)(u32Result / 1024);
}
router程序修改完了
2.协调器中程序修改,有两个方法
(1) 方法一
PRIVATE void vTxSerialDataFrame(uint16 u16NodeId,
uint16 u16Humidity,
uint16 u16Temperature,
uint16 u16BattVoltage,
uint16 sensorname)
{
vPrintf("\n\r\n\rA %x", u16NodeId);
vPrintf("\n\rH %d", u16Humidity);
vPrintf("\n\rT %f", (double)((double)u16Temperature/10));//以float型输出,u16Temperature/10产生了小数点。但是vPrintf函数中不支持float输出
vPrintf("\n\rV %d", u16BattVoltage);
vPrintf("\n\rSN %d", sensorname);
#endif
}
在vPrintf中添加如下代码
int32 i;
double j;
double k;
int n=0;//浮点数小数点后0的个数
int m;
//下边是重点
case 'f':
j = va_arg(ap,double);
i = (int32)j;
vNum2String(i,10);
vPutChar('.');
k=(j-i);
while((0<k)&(k<0.1))
{
k *= 10;
n++;
if(n >=16)
{
k=0;
n=15;
}
}
for(m=0;m<n;m++)
{
vNum2String(0, 10);
}
k *= 10;//这里我改为了10,因为只需要一位小数就OK
vNum2String(k, 10);
break;
(2)方法二
把 整数转成了字符串。
PRIVATE void vTxSerialDataFrame(uint16 u16NodeId,
uint16 u16Humidity,
uint16 u16Temperature,
uint16 u16BattVoltage,
uint16 sensorname)
{
#ifndef GDB
char T[4];
T[2]='.';//因为保留一位小数,在此添加小数点
T[4]='\0';
switch(u16Temperature/100)
{
case 0:T[0]='0';break;
case 1:T[0]='1';break;
case 2:T[0]='2';break;
case 3:T[0]='3';break;
case 4:T[0]='4';break;
case 5:T[0]='5';break;
case 6:T[0]='6';break;
case 7:T[0]='7';break;
case 8:T[0]='8';break;
case 9:T[0]='9';break;
default:break;
}
switch(u16Temperature%100/10)
{
case 0:T[1]='0';break;
case 1:T[1]='1';break;
case 2:T[1]='2';break;
case 3:T[1]='3';break;
case 4:T[1]='4';break;
case 5:T[1]='5';break;
case 6:T[1]='6';break;
case 7:T[1]='7';break;
case 8:T[1]='8';break;
case 9:T[1]='9';break;
default:break;
}
switch(u16Temperature%100%10)
{
case 0:T[3]='0';break;
case 1:T[3]='1';break;
case 2:T[3]='2';break;
case 3:T[3]='3';break;
case 4:T[3]='4';break;
case 5:T[3]='5';break;
case 6:T[3]='6';break;
case 7:T[3]='7';break;
case 8:T[3]='8';break;
case 9:T[3]='9';break;
default:break;
}
vPrintf("\n\r\n\rA %x", u16NodeId);
vPrintf("\n\rH %d", u16Humidity);
vPrintf("\n\rT %s",T); //输出 转化完成的字符串,vPrintf中支持字符串。
vPrintf("\n\rV %d", u16BattVoltage);
vPrintf("\n\rSN %d", sensorname);
#endif
}
3关于节点休眠
在router程序的JZA_vStackEvent中添加以下代码
vAHI_WakeTimerEnable(E_AHI_WAKE_TIMER_0,TRUE);//唤醒时钟使能
vAHI_WakeTimerStart(E_AHI_WAKE_TIMER_0,32000*60);//32000*60是休眠一分钟
u8AHI_WakeTimerFiredStatus();
vAHI_PowerDown( FALSE ); // False -> Sleep; TRUE -> Deep Sleep
//vBosRequestSleep(TRUE);//False不带内存休眠;TRUE带内存休眠,在Zigbee中必须使用这种模式