这个Zigbee的项目好久没有写了,现在对这个项目有点陌生,好多东西都搞不懂了。今天写一个简单的无线发送小程序时,一直出问题,程序调用zstack中的AF_DataRequest函数,如下

AF_DataRequest( &Coor_Addr, &App_epDesc,
                       APP_CLUSTERID_ADC,
                       sizeof(ADC_Value),
                       (uint8 *)adc_value,
                       &AppTransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS );

(uint8 *)adc_value为要发送数据的地址,必须为8位无符号的指针。然后我就很悲催的写了一个结构体ADC_Value,全部的代码如下。

void ADC(void)
  {
  ADC_Value *adc_value;
  adc_value->x=HalAdcRead(HAL_ADC_CHANNEL_0,HAL_ADC_RESOLUTION_12); //计算数值
  adc_value->y=HalAdcRead(HAL_ADC_CHANNEL_1,HAL_ADC_RESOLUTION_12);//计算数值
  adc_value->z=HalAdcRead(HAL_ADC_CHANNEL_4,HAL_ADC_RESOLUTION_12);//计算数值
  AF_DataRequest( &Coor_Addr, &App_epDesc,               //发送数据
                       APP_CLUSTERID_ADC,
                       sizeof(ADC_Value),
                       (uint8 *)adc_value,
                       &AppTransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS );
 osal_start_timerEx(AppTaskID,APP_ADC_EVT,5000);   //设置定时器,循环发送
  
}

    编译后有个警告,“the adc_value is used before its value is set”,当时也没在意,下载程序到板子上后,数据发送第一次正常,其余的全部都是错误的数据,而且数据值全部一样,或者程序直接跑飞了。

    我就百思不得其解啊,很郁闷,但又不知道问题出在哪里了。后来发现问题出在哪里了。不知道各位看官看出来问题在哪里没?

    代码第一行ADC_Value *adc_value;只声明了一个指针,却没有分配内存空间,导致出现问题。用java用的连这个基本的问题都忽略了!这说明我学习还是不够用心不够深入。正确的代码为:

void ADC(void)
  {
  ADC_Value *adc_value;
  adc_value=(ADC_Value *)osal_msg_allocate(sizeof(ADC_Value));
  adc_value->x=HalAdcRead(HAL_ADC_CHANNEL_0,HAL_ADC_RESOLUTION_12);
  adc_value->y=HalAdcRead(HAL_ADC_CHANNEL_1,HAL_ADC_RESOLUTION_12);
  adc_value->z=HalAdcRead(HAL_ADC_CHANNEL_4,HAL_ADC_RESOLUTION_12);
  AF_DataRequest( &Coor_Addr, &App_epDesc,
                       APP_CLUSTERID_ADC,
                       sizeof(ADC_Value),
                       (uint8 *)adc_value,
                       &AppTransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS );
 osal_msg_deallocate((uint8 *)adc_value);
 osal_start_timerEx(AppTaskID,APP_ADC_EVT,5000);
  
}