void Get_Compensation_Capacitance_Value(unsigned char*data,int num,int tempValue,unsigned char*compensateC);
int main()
{
/* 我的第一个 C 程序 */
printf("Hello, World! \n");
unsigned char data[20] ={0x01,0x19,0x00,0x02 ,0x20, 0x02, 0x25 ,0x00, 0x02, 0x81, 0x03, 0x28, 0x10, 0x02, 0x88 ,0x04, 0x35, 0x00, 0x02, 0x98};
unsigned char compensateC[2] = {0};
Get_Compensation_Capacitance_Value(data,4,51,compensateC);
return 0;
}
void Get_Compensation_Capacitance_Value(unsigned char*data,int num,int tempValue,unsigned char*compensateC)
{
typedef struct
{
unsigned char pointData[5];
int X_tempNum;
int y_cvalue;
}OriginalData;//
typedef struct
{
OriginalData data[2];
float K_gradient;
float b_constant;
}HandlelData; //
unsigned char* allData = data;//初检数据如:01 19 00 02 20 02 25 00 02 81 03 28 10 02 88 04 35 00 02 98
double y_result = 0.0;
int y_resultHex = 0;
int pointNum = num;
// Debug_Printf("pointNum:%d\r\n",pointNum);
if(pointNum<=1)
{
compensateC[0] = allData[3];
compensateC[1] = allData[4];
}
else
{
OriginalData _originalData[pointNum];
HandlelData _handleData[pointNum-1];
for(int i =0; i < pointNum; i++)
{
memcpy(_originalData[i].pointData,&allData[i*5],5);
allData[2+i*5] = (allData[2+i*5] == 0)? 1:0;
_originalData[i].X_tempNum = (int16_t)(allData[1+i*5]<<1)|allData[2+i*5];
_originalData[i].y_cvalue = (uint16_t)(allData[3+i*5]<<8)|allData[4+i*5];
//Debug_Printf("pointData:%02X %02X %02X %02X %02X X_tempNum:%d y_cvalue:%d\r\n",_originalData[i].pointData[0],_originalData[i].pointData[1],_originalData[i].pointData[2],_originalData[i].pointData[3],_originalData[i].pointData[4],_originalData[i].X_tempNum,_originalData[i].y_cvalue);
}
for(int i = 0; i < pointNum-1; i++)
{
_handleData[i].data[0] = _originalData[i];
_handleData[i].data[1] = _originalData[i+1];
_handleData[i].K_gradient = (float)(_handleData[i].data[1].y_cvalue - _handleData[i].data[0].y_cvalue) / (float)(_handleData[i].data[1].X_tempNum - _handleData[i].data[0].X_tempNum);
_handleData[i].b_constant = _handleData[i].data[1].y_cvalue - _handleData[i].K_gradient * _handleData[i].data[1].X_tempNum;
//Debug_Printf("handleData:%02X %02X %02X %02X %02X,K_gradient:%0.3f,b_constant:%0.3f\r\n",_handleData[i].data[0].pointData[0],_handleData[i].data[0].pointData[1],_handleData[i].data[0].pointData[2],_handleData[i].data[0].pointData[3],_handleData[i].data[0].pointData[4],_handleData[i].K_gradient,_handleData[i].b_constant);
//Debug_Printf("handleData:%02X %02X %02X %02X %02X,K_gradient:%0.3f,b_constant:%0.3f\r\n",_handleData[i].data[1].pointData[0],_handleData[i].data[1].pointData[1],_handleData[i].data[1].pointData[2],_handleData[i].data[1].pointData[3],_handleData[i].data[1].pointData[4],_handleData[i].K_gradient,_handleData[i].b_constant);
}
for(int i = 0; i < pointNum; i++)
{
if(_originalData[i].X_tempNum <= tempValue && tempValue <= _originalData[i+1].X_tempNum)
{
y_result = _handleData[i].K_gradient * tempValue + _handleData[i].b_constant;
//Debug_Printf("K_gradient:%0.4f,b_constant:%0.4f,y_result:%0.4f\r\n",_handleData[i].K_gradient,_handleData[i].b_constant,y_result);
}
}
y_resultHex = (int)y_result;
compensateC[0] = (y_resultHex >> 8) & 0xFF;
compensateC[1] = y_resultHex & 0xFF;
printf("25:%02X,26:%02X\r\n", compensateC[0],compensateC[1]);
// Debug_Printf("compensateC:%02X,%02X\r\n",compensateC[0],compensateC[1]);
//SendBackMessageWithStruct(MESSAGE_COMPENSATION_CAPACITANCE,(unsigned char*)compensateC,sizeof(compensateC));
}
}