📄 dtc.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 + -