這個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); }