⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdacomm.cpp

📁 采用LPC的芯片做的气体排放检测,包括气体成分分析,数据的处理,数据传输给工作站.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	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 + -