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

📄 dtc.c

📁 汽车电子解码器电缆测试。可以判断汽车故障在哪里
💻 C
字号:
/******************************************************************************************
 *  目的:故障码功能模块
 *  功能:提供故障码读取及檫除功能
 *  模块依赖:Systemint.h
 ******************************************************************************************/
#include "Systemint.h"
#include "DTC.h"
#include "main.h"

#define DTCRECIVELEN     256                 //故障码最大接收长度
struct  DTCsol
{
     unsigned char DtcNum;                   //故障码数量
     unsigned char DTCsend[20];              //待发送故障码功能请求命令
     unsigned char DTCrecive[DTCRECIVELEN];  //故障码功能回收数据
     unsigned int  DTCValue[DTCRECIVELEN/2]; //故障码码号
}    TagDTC;


/*
**-----------------------------------------------------------------------------------------
** 读取故障码外部调用主函数
**-----------------------------------------------------------------------------------------
*/
char  ReadDTC()
{
#ifdef DEBUGMODE
     DebugString( "ReadDTC()" );
#endif
     //添加显示信息
     unsigned char  *Read[]=
     {
          "正在读取故障码",
          "请等待...",
     };
     unsigned char RStartline = 0;
     unsigned char RUserline = 0;
     unsigned char RMaxl = 2;
     unsigned char *Fail[]=
     {
          "通讯失败!",
          "[NO] 返回"
     };
     unsigned char FStartline = 0;
     unsigned char FUserline = 0;
     unsigned char FMaxl = 2;
     unsigned char  *NoCode[]=
     {
          "系统无故障!",
          "[NO] 返回"
     };
     unsigned char NStartline = 0;
     unsigned char NUserline = 0;
     unsigned char NMaxl = 2;
     //显示正在读取
     ScreenInit( W_STAT );
     AddMenu( Read, RMaxl );
     ScreenAct( &RStartline, &RUserline );
     //正在发送
     if( !SendDTC( TagDTC.DTCrecive ) )
     {
          ScreenInit( W_STAT );
          AddMenu( Fail, FMaxl );
          while( ScreenAct( &FStartline, &FUserline ) != W_RETURN );
          return FAIL;
     }
     else
     {
          //NULL
     }
     //根据回送获取故障码
     if( GetDTC( TagDTC.DTCrecive, TagDTC.DTCValue ) )
     {
          //显示故障码
          ShowDTC( TagDTC.DTCValue );
     }
     else
     {
          ScreenInit( W_STAT );
          AddMenu( NoCode, NMaxl );
          while( ScreenAct( &NStartline, &NUserline ) != W_RETURN );
     }
     return SUCCESS;
}
/*
**-----------------------------------------------------------------------------------------
** 发送故障码命令
** DTCout:读取到的 DTC 回送数据
**-----------------------------------------------------------------------------------------
*/
char  SendDTC( unsigned char *DTCout )
{
#ifdef DEBUGMODE
     DebugString( "SendDTC()" );
#endif
     //根据系统完成故障码读取请求
     if( SysID == HFDRF || SysID == HFDRFMT || SysID == HFLBDRF )   //哈飞汽车 -> 德尔福电控 -> 民意MT20 -> 路宝ENG
     {
          TagDTC.DTCsend[0] = 0x84;
          TagDTC.DTCsend[1] = 0x11;
          TagDTC.DTCsend[2] = 0xF1;
          TagDTC.DTCsend[3] = 0x18;
          TagDTC.DTCsend[4] = 0x00;
          TagDTC.DTCsend[5] = 0xFF;
          TagDTC.DTCsend[6] = 0x00;
          TagDTC.DTCsend[7] = 0x9D;
          KW_Send( TagDTC.DTCsend, 10 );
          if( KW_Read( DTCout, 500, 255 ) )
          {
               return SUCCESS;
          }
     }
     else if( SysID == HFM154 )    //哈飞汽车 -> 联电M154
     {
          unsigned char i;
          unsigned char Temp[16];
          //询问故障码个数
          //06 0E 01 01 08 F1 03
          TagDTC.DTCsend[0] = 0x06;
          TagDTC.DTCsend[1] = 0x0E;
          TagDTC.DTCsend[2] = 0x01;
          TagDTC.DTCsend[3] = 0x01;
          TagDTC.DTCsend[4] = 0x08;
          TagDTC.DTCsend[5] = 0xF1;
          TagDTC.DTCsend[6] = 0x03;
          VW_Send( TagDTC.DTCsend, 10 );
          if( !VW_Read( Temp, 500, 16 ) )
          {
               return FAIL;
          }
          TagDTC.DtcNum = Temp[ 3 ];  //故障码数量位置 3
          //询问具体故障码信息
          for( i=0; i<TagDTC.DtcNum; i++ )
          {
               //06 14 01 05 08 i*5 03
               TagDTC.DTCsend[0] = 0x06;
               TagDTC.DTCsend[1] = 0x14;
               TagDTC.DTCsend[2] = 0x01;
               TagDTC.DTCsend[3] = 0x05;
               TagDTC.DTCsend[4] = 0x08;
               TagDTC.DTCsend[5] = i*5;
               TagDTC.DTCsend[6] = 0x03;
               VW_Send( TagDTC.DTCsend, 10 );
               if( !VW_Read( Temp, 500, 16 ) )
               {
                    return FAIL;
               }
               DTCout[i*2]   = Temp[4]; //故障元件号
               DTCout[i*2+1] = Temp[5]; //故障属性
               delay( 50 );
          }
          return SUCCESS;
     }
     else if( SysID == HFSMABS )   //哈飞汽车 -> 赛马ABS
     {
          TagDTC.DTCsend[0] = 6;
          TagDTC.DTCsend[1] = 0x68;
          TagDTC.DTCsend[2] = 0x6A;
          TagDTC.DTCsend[3] = 0xF1;
          TagDTC.DTCsend[4] = 0xB1;
          TagDTC.DTCsend[5] = 0x01;
          TagDTC.DTCsend[6] = 0x75;
          ISO686A_Send( TagDTC.DTCsend, 10 );
          if( ISO686A_Recive( DTCout, 500, 255 ) )
          {
               return SUCCESS;
          }
     }
     /*else  if( SysID == ENG1 )
     {

     }*/
     else
     {
          //NULL
     }
     //................................................................................
     return FAIL;
}
/*
**-----------------------------------------------------------------------------------------
** 根据不同的数据解析故障码码号
** DTCin:接收到的读码回送数据
** DTCout:输出的码号
** 返回:故障码数量
**-----------------------------------------------------------------------------------------
*/
unsigned char  GetDTC( unsigned char *DTCin,unsigned int *DTCout )
{
#ifdef DEBUGMODE
     DebugString( "GetDTC()" );
#endif
     int  i,UserTemp;
     //根据系统完成故障码解析过程
     if( SysID == HFDRF || SysID == HFDRFMT || SysID == HFLBDRF )  //哈飞汽车 -> 德尔福电控 -> 民意MT20 -> 路宝ENG
     {
          if( DTCin[0] > 0x80 )
          {
               UserTemp = 4;
          }
          else  if( DTCin[0] == 0x80 )
          {
               UserTemp = 5;
          }
          else
          {
               UserTemp = 1;
          }
          if( DTCin[UserTemp-1] != 0x58 )
          {
               TagDTC.DtcNum = 0;
          }
          else
          {
               TagDTC.DtcNum = DTCin[UserTemp++];
          }
          for( i=0; i<(int)TagDTC.DtcNum; i++ )
          {
               DTCout[i] = (int)DTCin[i*3+UserTemp]*256 + (int)DTCin[i*3+UserTemp+1];
          }
     }
     else if( SysID == HFM154 )    //哈飞汽车 -> 联电M154
     {
          for( i=0; i<(int)TagDTC.DtcNum; i++ )
          {
               DTCout[i*2] = (int)DTCin[i*2];
               DTCout[i*2+1] = (int)DTCin[i*2+1];
          }
     }
     else if( SysID == HFSMABS )   //哈飞汽车 -> 赛马ABS
     {
          // 故障码起始字节
          UserTemp = 5;
          // 计算码号
          if( DTCin[ 0 ] < 7 )
          {
               TagDTC.DtcNum = 0;
          }
          else
          {
               TagDTC.DtcNum = (unsigned char)( ( DTCin[ 0 ] - 5 )/2 );
          }
          // 解析故障码
          for( i=0; i<(int)TagDTC.DtcNum; i++ )
          {
               DTCout[i] = (int)DTCin[i*2+UserTemp]*256 + (int)DTCin[i*2+UserTemp+1];
          }

     }
     else
     {
          //NULL
     }
     //................................................................................
     return TagDTC.DtcNum;
}
/*
**-----------------------------------------------------------------------------------------
** 填充从汽车读到的故障码码号和内容并显示
** DTCin:解析到的故障码码号
**-----------------------------------------------------------------------------------------
*/
//在这里添加故障码库起始地址
#define HFQCADDRESS 0xB4000
#define DRFADDRESS  0xAC000
void  ShowDTC( unsigned int *DTCin )
{
#ifdef DEBUGMODE
     DebugString( "ShowDTC()" );
#endif
     unsigned char i;
     unsigned char Startline;
     unsigned char Userline;
     unsigned char Temp[200];
     unsigned char Rep;
     for( i=0; i<TagDTC.DtcNum; i++ )
     {
          Startline = 0;
          Userline = 0;
          ScreenInit( W_TEXT );
          sprintf( (char *)Temp,"故障码:[%02d/%02d]", i+1, TagDTC.DtcNum );
          AddString( Temp );
          if( SysID == HFDRF )          //哈飞汽车 -> 德尔福电控
          {
               if( GetOneMessage( DRFADDRESS, 1, DTCin[i], Temp ) )
               {
                    AddString( Temp );
               }
               else AddString( "未定义故障码" );
          }
          else if( SysID == HFDRFMT )   //哈飞汽车 -> 民意MT20
          {
               if( GetOneMessage( HFQCADDRESS, 2, DTCin[i], Temp ) )
               {
                    AddString( Temp );
               }
               else AddString( "未定义故障码" );
          }
          else if( SysID == HFM154 )    //哈飞汽车 -> 联电M154
          {
               AddString( "故障元件:" );
               if( GetOneMessage( HFQCADDRESS, 3, DTCin[i*2], Temp ) )
               {
                    AddString( Temp );
               }
               else AddString( "未定义元件故障" );
               AddString( "故障属性:" );
               if( GetOneMessage( HFQCADDRESS, 4, DTCin[i*2+1], Temp ) )
               {
                    AddString( Temp );
               }
               else AddString( "未定义故障" );
          }
          else if( SysID == HFLBDRF )   //哈飞汽车 -> 路宝ENG
          {
               if( GetOneMessage( HFQCADDRESS, 5, DTCin[i], Temp ) )
               {
                    AddString( Temp );
               }
               else AddString( "未定义故障码" );
          }
          else if( SysID == HFSMABS )   //哈飞汽车 -> 赛马ABS
          {
               if( GetOneMessage( HFQCADDRESS, 1, DTCin[i], Temp ) )
               {
                    AddString( Temp );
               }
               else AddString( "未定义故障码" );
          }
          Rep = W_NULL;
          while( Rep )
          {
               Rep = ScreenAct( &Startline, &Userline );
               switch( Rep )
               {
                    case W_RETURN: return;
                    case W_OK: Rep = 0; break;
               }
          }
     }
}
/*
**-----------------------------------------------------------------------------------------
** 清除故障码,无响应返回0
**-----------------------------------------------------------------------------------------
*/
char  ClrDTC()
{
#ifdef DEBUGMODE
     DebugString( "ClrDTC()" );
#endif
//添加显示信息
     unsigned char  *Clr[]=
     {
          "正在清除故障码",
          "请等待...",
     };
     unsigned char  *CFail[]=
     {
          "通讯失败!",
          "[NO] 返回"
     };
     unsigned char  *Ses[]=
     {
          "成功清除故障码",
          "[NO] 返回"
     };
     unsigned char  *User[]=
     {
          "打开钥匙关闭引擎",
          "YES 确定 NO 返回"
     };
     unsigned char Startline = 0;
     unsigned char Userline = 0;
     unsigned char Rip = W_NULL;
     ScreenInit( W_STAT );
     AddMenu( User, 2 );
     while( Rip != W_OK )
     {
          Rip = ScreenAct( &Startline, &Userline );
          if( Rip == W_RETURN )    return 1;
     }
     ScreenInit( W_STAT );
     AddMenu( Clr, 2 );
     ScreenAct( &Startline, &Userline );
//根据系统发送清码指令
     if( SysID == HFDRF || SysID == HFDRFMT || SysID == HFLBDRF )   //哈飞汽车 -> 德尔福电控 -> 民意MT20 -> 路宝ENG
     {
          TagDTC.DTCsend[0] = 0x83;
          TagDTC.DTCsend[1] = 0x11;
          TagDTC.DTCsend[2] = 0xF1;
          TagDTC.DTCsend[3] = 0x14;
          TagDTC.DTCsend[4] = 0xFF;
          TagDTC.DTCsend[5] = 0x00;
          TagDTC.DTCsend[6] = 0x98;
          KW_Send( TagDTC.DTCsend, 10 );
          if( !KW_Read( TagDTC.DTCrecive, 500, 255 ) )
          {
               ScreenInit( W_STAT );
               AddMenu( CFail, 2 );
               while( ScreenAct( &Startline, &Userline ) != W_RETURN );
               return FAIL;
          }
          else
          {
               //NULL
          }
     }
     else if( SysID == HFM154 )    //哈飞汽车 -> 联电M154
     {
          TagDTC.DTCsend[0] = 0x03;
          TagDTC.DTCsend[1] = 0x00;
          TagDTC.DTCsend[2] = 0x05;
          TagDTC.DTCsend[3] = 0x03;
          VW_Send( TagDTC.DTCsend, 10 );
          if( !VW_Read( TagDTC.DTCrecive, 500, 255 ) )
          {
               ScreenInit( W_STAT );
               AddMenu( CFail, 2 );
               while( ScreenAct( &Startline, &Userline ) != W_RETURN );
               return FAIL;
          }
          else
          {
               //NULL
          }
     }
     else if( SysID == HFSMABS )   //哈飞汽车 -> 赛马ABS
     {
          TagDTC.DTCsend[0] = 5;
          TagDTC.DTCsend[1] = 0x68;
          TagDTC.DTCsend[2] = 0x6A;
          TagDTC.DTCsend[3] = 0xF1;
          TagDTC.DTCsend[4] = 0x14;
          TagDTC.DTCsend[5] = 0xD7;
          ISO686A_Send( TagDTC.DTCsend, 10 );
          if( !ISO686A_Recive( TagDTC.DTCrecive, 500, 255 ) )
          {
               ScreenInit( W_STAT );
               AddMenu( CFail, 2 );
               while( ScreenAct( &Startline, &Userline ) != W_RETURN );
               return FAIL;
          }
          else
          {
               //NULL
          }

     }

     ScreenInit( W_STAT );
     AddMenu( Ses, 2 );
     while( ScreenAct( &Startline, &Userline ) != W_RETURN );
     return SUCCESS;
}
//----------------------------------------------------------------- End Of File -----------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -