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