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

📄 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 == ENGISO )    //北京吉普 -> 引擎系统
     {
          //03H 31H 51H 85H
          TagDTC.DTCsend[0] = 0x03;
          TagDTC.DTCsend[1] = 0x31;
          TagDTC.DTCsend[2] = 0x51;
          TagDTC.DTCsend[3] = 0x85;
          KW_Send( TagDTC.DTCsend, 10 );
          if( KW_Read( DTCout, 500, 255 ) )
          {
               return SUCCESS;
          }
     }
     else
     {
          //NULL
     }
     //................................................................................
     return FAIL;
}
/*
**-----------------------------------------------------------------------------------------
** 根据不同的数据解析故障码码号
** DTCin:接收到的读码回送数据
** DTCout:输出的码号
** 返回:故障码数量
**-----------------------------------------------------------------------------------------
*/
unsigned char  GetDTC( unsigned char *DTCin,unsigned int *DTCout )
{
#ifdef DEBUGMODE
     DebugString( "GetDTC()" );
#endif
     int  i;
     //根据系统完成故障码解析过程
     if( SysID == ENGISO )   //北京吉普 -> 引擎系统
     {
          unsigned char DTCTable[6][8] =
          {
               {0x21,0x13,0x12,0x14,0x11,0x31,0x31,0x00},//Byte3
               {0x81,0x00,0x00,0x00,0x23,0x24,0x22,0x00},//Byte5
               {0x91,0x91,0x93,0x93,0x94,0x94,0x92,0x92},//Byte7
               {0x44,0x44,0x52,0x52,0x15,0x15,0x69,0x69},//Byte9
               {0x00,0x00,0x46,0x46,0x49,0x49,0x10,0x10},//Byte11
               {0x01,0x01,0x01,0x01,0x02,0x02,0x79,0x79} //Byte13
          };
          int j;
          TagDTC.DtcNum = 0;
          // 查询 Byte3 ~ Byte15
          for( i=0; i<6; i++ )
          {
               // 查询 Bit0 ~ Bit7
               for( j=0; j<8; j++ )
               {
                    //查表当前码 Byte3,5,7,9,11,13
                    if( (DTCin[i*2+3]>>j)&0x01 )
                    {
                         if( DTCTable[i][j] )
                         {
                              DTCout[TagDTC.DtcNum++] = (int)DTCTable[i][j];
                         }
                    }
                    //查表历史码 Byte4,6,8,10,12,14
                    else if( (DTCin[i*2+4]>>j)&0x01 )
                    {
                         if( DTCTable[i][j] )
                         {
                              DTCout[TagDTC.DtcNum++] = (int)DTCTable[i][j];
                         }
                    }
               }
          }
     }
     //................................................................................
     return TagDTC.DtcNum;
}
/*
**-----------------------------------------------------------------------------------------
** 填充从汽车读到的故障码码号和内容并显示
** DTCin:解析到的故障码码号
**-----------------------------------------------------------------------------------------
*/
//在这里添加故障码库起始地址
#define BJJPADDRESS 0x50000
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 == ENGISO )   //北京吉普 -> 引擎系统
          {
               if( GetOneMessage( BJJPADDRESS, 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 == ENGISO )    //北京吉普 -> 引擎系统
     {
          // ->ECU 02H,45H,48H ECU-> 02H,45H,48H
          TagDTC.DTCsend[0] = 0x02;
          TagDTC.DTCsend[1] = 0x45;
          TagDTC.DTCsend[2] = 0x48;
          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
          }
     }

     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 + -