程序1

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中必须使用这种模式


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ANTRK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值