📄 mdacomm.cpp
字号:
{
U32 ucTemp,i;
#ifdef FLOAT_LAMBDA
double HCVAL,COVAL, CO2VAL, O2VAL,fTemp;
#endif
#ifdef _GET_CO2_
//float* fp;
//fp = (float*)&i;
#endif
// 2005-09-14 增加了消除仪器自动返回的[7e 01 c2 3c]的判断
// 2005-09-14
Proccess_0x7E(pReadData,&nReadBufLen,1);
for(i=0;i<8;i++)
{
if(pReadData[i] != FGA4100_RIGHT_ANSWER[i])
return FALSE;
}
if(enuFGA4100Cmd_GetData==ucCmdCode){
if(nReadBufLen==51){
ucTemp =18;
pWriteData->wHC=Char4ToShort(&pReadData[ucTemp]);
ucTemp+=4;
pWriteData->wCO=Char4ToShort(&pReadData[ucTemp]);
ucTemp+=4;
pWriteData->wCO2=Char4ToShort(&pReadData[ucTemp]);
ucTemp+=4;
pWriteData->wO2=Char4ToShort(&pReadData[ucTemp]);
ucTemp+=4;
pWriteData->wNO=Char4ToShort(&pReadData[ucTemp]);
ucTemp+=4;
pWriteData->wLAMBDA=Char4ToShort(&pReadData[ucTemp]);
// pWriteData->wLAMBDA /= 10;
ucTemp+=4;
pWriteData->wSPEED=Char4ToShort(&pReadData[ucTemp]);
if (g_VehicleInfo.ucDivData)
{
pWriteData->wSPEED /= g_VehicleInfo.ucDivData;
}
ucTemp+=4;
pWriteData->wOIL_T=Char4ToShort(&pReadData[ucTemp]);
#ifndef HWD_FGA_4100A
#ifdef WIN32
S8 RecordBuf[256];
memset(RecordBuf,0,sizeof(RecordBuf));
sprintf(RecordBuf,"%d,%d,%d,%d,%d,%d,%d,%d\r\n",pWriteData->wHC,pWriteData->wCO,pWriteData->wCO2,
pWriteData->wO2,pWriteData->wNO,pWriteData->wLAMBDA,pWriteData->wSPEED,pWriteData->wOIL_T);
i = strlen(RecordBuf);
FILEWrite2TXT((U8*)RecordBuf,i);
#endif
#endif
#ifdef FLOAT_LAMBDA
HCVAL = (double)(pWriteData->wHC);
COVAL = (double)(pWriteData->wCO)/100;
CO2VAL= (double)(pWriteData->wCO2)/10;
O2VAL = (double)(pWriteData->wO2)/10;
fTemp=CalLambda(HCVAL ,COVAL ,CO2VAL,O2VAL ,g_VehicleInfo.ucFuelIndex);
pWriteData->wLAMBDA=(U16)((fTemp+0.005)*100);
#endif
return TRUE;
}else
return FALSE;
}else if(enuFGA4100Cmd_GetCO2==ucCmdCode) {
if(nReadBufLen>=210)
{
FloatToU8(pf,pReadData+17+78+12);
#ifdef _GET_CO2_
//float HCVAL,COVAL, CO2VAL, O2VAL,fTemp;
HCVAL =GetFloatByUnion(&pReadData[17+54]);
COVAL =GetFloatByUnion(&pReadData[17+60]);
CO2VAL=GetFloatByUnion(&pReadData[17+66]);
O2VAL =GetFloatByUnion(&pReadData[17+72]);
if(HCVAL < 0.5) pWriteData->wHC = 0;
else pWriteData->wHC = (U16)(HCVAL+0.5f) ;
pWriteData->wCO = (U16)((COVAL+0.005f) *100);
pWriteData->wCO2 = (U16)((CO2VAL+0.05f)*10);
pWriteData->wO2 = (U16)((O2VAL +0.05f)*10);
/*
HCVAL =GetFloatByUnion(&pReadData[17+0]);
COVAL =GetFloatByUnion(&pReadData[17+6]);
CO2VAL=GetFloatByUnion(&pReadData[17+12]);
O2VAL =GetFloatByUnion(&pReadData[17+18]);
*/
fTemp = (GetFloatByUnion(&pReadData[17+78]));
if(fTemp < 0.5) pWriteData->wNO = 0;
else pWriteData->wNO = (short)(fTemp+0.5f);
pWriteData->wSPEED = (short)GetFloatByUnion(&pReadData[17+180]);
pWriteData->wOIL_T = (short)((GetFloatByUnion(&pReadData[17+186])+0.05f)*10);
fTemp=CalLambda(HCVAL ,COVAL ,CO2VAL,O2VAL ,g_VehicleInfo.ucFuelIndex);
pWriteData->wLAMBDA=(short)((fTemp+0.005)*100);
#endif
}
else
return FALSE;
}
else if(enuFGA4100Cmd_ReadSpan == ucCmdCode) //读取校准后的因子,以浮点表示j=27;
{
if(nReadBufLen < 20) return FALSE;
for (ucTemp=27;ucTemp<27+20;ucTemp+=4)
{
FloatToU8(pf,pReadData+ucTemp);
pf++;
}
}else if(enuFGA4100Cmd_CalibStart == ucCmdCode) { //开始校准,等待回应;
if(nReadBufLen < 20) return FALSE;
}else if(enuFGA4100Cmd_GetP_E_F == ucCmdCode) {
if(nReadBufLen > 30)
FloatToU8(pf,pReadData+27);
else
return FALSE;
}else if(enuFGA4100Cmd_GetPenuVar == ucCmdCode) {
if(nReadBufLen > 30)
FloatToU8(pf,pReadData+35);
else
return FALSE;
}else if((enuFGA4100Cmd_ReadComp == ucCmdCode)){
if(nReadBufLen >= 210)
memcpy((U8*)(MeasureRecord),pReadData,nReadBufLen);
else
return FALSE;
}else if((enuFGA4100Cmd_ReadAD_Count == ucCmdCode)){
if(nReadBufLen >= 135)
memcpy((U8*)(MeasureRecord),pReadData,nReadBufLen);
else
return FALSE;
}else if(enuFGA4100Cmd_WriteGrandO2 == ucCmdCode){
if(nReadBufLen < 30) return FALSE;
}else if(enuFGA4100Cmd_WritePenuVar == ucCmdCode){
if(nReadBufLen < (35)) return FALSE;
}
return TRUE;
}
BOOL PerformDevCmd(unsigned char ucCmdCode,_DEV_FGA4100_DATA* pWriteData,float* pf,U8 uc_RT)
{
unsigned int nTryTimes,nRecDataLen;
unsigned int nDelayTime,nPassTime;
unsigned char RxBuf[256];
memset(RxBuf,0,sizeof(RxBuf));
nTryTimes=0;
if((enuFGA4100Cmd_GetCO2==ucCmdCode) ||
(enuFGA4100Cmd_ReadComp==ucCmdCode) ||
(enuFGA4100Cmd_ReadAD_Count==ucCmdCode) ){
nDelayTime = 400;
nRecDataLen = 120;
}else if(enuFGA4100Cmd_CalibStart==ucCmdCode){
nDelayTime = 20000;//等待 20s 的时间让平台完成校准
nRecDataLen =8;
}else{
nDelayTime = 200;//实际应该是150ms
nRecDataLen =8;
}
g_bDevConnected = TRUE;
for(;;)
{
nTryTimes++;
if(nTryTimes>3)
{
#ifndef HWD_FGA_4100A
#ifdef WIN32
memset(RxBuf,0,sizeof(RxBuf));
sprintf((S8*)RxBuf,"3 times fail\r\n");
nRecDataLen = strlen((S8*)RxBuf);
FILEWrite2TXT((U8*)RxBuf,nRecDataLen);
#endif
#endif
g_bDevConnected = FALSE;// g_nErrorCode = enuMyError_ConnetMac;
return FALSE;
}
FFPortClearRxBuf(uc_RT);
SendCmdToDev(ucCmdCode,RxBuf,pf,uc_RT);
//////////////////////////////////////////////////////////////////////////
//nPassTime = GetSysTimeTick();
SleepAndQueryMsg(nDelayTime);//{ //有需要执行消息到达,舍弃仪器的回应
//nPassTime = GetSysTimeTick()-nPassTime; // 记录发送命令后经过多少ms,
//if (nPassTime<200){ // 如果时间大于200ms,不再等待;
//nDelayTime =200 - nPassTime;
//Sleep(nDelayTime);
//}
//FFPortClearRxBuf(uc_RT);
//return FALSE;
//}
//////////////////////////////////////////////////////////////////////////
memset(RxBuf,0,sizeof(RxBuf));
if(!ReadDevReply(ucCmdCode,RxBuf,&nRecDataLen,uc_RT)){
#ifndef HWD_FGA_4100A
#ifdef WIN32
memset(RxBuf,0,sizeof(RxBuf));
sprintf((S8*)RxBuf,"read continue fail\r\n");
nRecDataLen = strlen((S8*)RxBuf);
FILEWrite2TXT((U8*)RxBuf,nRecDataLen);
#endif
#endif
continue;
}
if(!TranslateRawData(ucCmdCode,
RxBuf,
pWriteData,
nRecDataLen,
pf))
{
//g_nErrorCode = enuMyError_ConnetMac;//
#ifndef HWD_FGA_4100A
#ifdef WIN32
memset(RxBuf,0,sizeof(RxBuf));
sprintf((S8*)RxBuf,"translate continue fail\r\n");
nRecDataLen = strlen((S8*)RxBuf);
FILEWrite2TXT((U8*)RxBuf,nRecDataLen);
#endif
#endif
continue;
}
break;
}
return TRUE;
}
/**********************************
//NO平台通讯
**********************************/
BOOL SendCmdToNO(Perform_CMD,P2)
{
switch(Perform_CMD)
{
case Zero_calibration:
SendBlock(4,ZERO_calibration,sizeof(ZERO_calibration));
return;
case Span_calibration:
SPAN_calibration[0]=0x04;
SPAN_calibration[1]=0x04;
SPAN_calibration[2]=0x11;
SPAN_calibration[3]=0x00;
SPAN_calibration[4]=(U8)(P2);
SPAN_calibration[5]=(U8)(P2>>8);
SPAN_calibration[6]=(U8)(0x19+SPAN_calibration[4]+SPAN_calibration[5]);
SendBlock(4,SPAN_calibration,sizeof(SPAN_calibration));
return;
case Get_NOData:
SendBlock(4,GET_NOdata,sizeof(GET_NOdata));
return;
default:return;
}
}
BOOL Handreplay_data(U8 Perform_CMD,U16* p1,U8* RX_Buf)
{
U8 nLen;
U8 i;
if( FFPortGetRxBufDataLen(4)>= 4)
{
nLen=FFPortGetRxBufDataLen(4);
if((nLen) > 60) return FALSE;
FFPortReadData(4,(unsigned char*)RX_Buf,nLen);
switch(Perform_CMD)
{
case Zero_calibration:
for(i=0;i<4;i++)
{
if(RX_Buf[i]!= Zero_replay[i])
return FALSE;
}
return TRUE;
case Span_calibration:
for(i=0;i<4;i++)
{
if(RX_Buf[i] != Span_replay[i])
return FALSE;
}
return TRUE;
case Get_NOData:
*p1=RX_Buf[4]+(RX_Buf[5]*256);
return TRUE ;
default:break;
}
}
else return FALSE;
}
BOOL PerformNOcmd(U8 Perform_cmd,U16* p1,U8* p2)
{
U8 i;
U8 Perform_CMD;
U16 Delay_Time;
unsigned char RX_Buf[256];
Perform_CMD=Perform_cmd;
if(Perform_CMD==Zero_calibration)
{
Delay_Time=200;
}else if(Perform_CMD==Span_calibration)
{
Delay_Time=300;
}else if(Perform_CMD==Get_NOData)
{
Delay_Time=300;
}
for(i=0;i<3;i++)
{
SendCmdToNO(Perform_CMD,p2);
SleepAndQueryMsg(Delay_Time);
if(!Handreplay_data(Perform_CMD,p1,RX_Buf))
{
continue;
}
return TRUE;
}
return FALSE;
//判断应答是否正确
}//
//////////// end of MdaComm.cpp /////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -