DTC(Diagnostic Trouble Code)表示诊断故障码,通常客户传递的诊断调查表中,只有如下图所示的5位标准故障码(DTCHighByte+DTCMiddleByte)和Symptom ID(DTCLowByte)。
那么,软件开发时,又需要将“U100888”转换为16进制的"D00088",如何转换呢?去网上搜了一下,找到了如何将标准故障码转换为16进制的规范,详情请参考:汽车DTC故障码格式解析_RichardsZ_的博客-CSDN博客
如何使用C在线实现呢,简单写了下,代码如下,有问题欢迎讨论指正!
#include<stdio.h>
typedef unsigned char u8;
int main()
{
char DTC1[]="B16EC11";
u8 byte2=0x00;
u8 byte1=0x00;
u8 byte0=0x00;
if(DTC1[0]== 'P')
{
byte2=0x00;
}
else if(DTC1[0]=='C')
{
byte2|=(1<<6);
}
else if(DTC1[0]=='B')
{
byte2|=(1<<7);
}
else if(DTC1[0]=='U')
{
byte2|=(1<<6);
byte2|=(1<<7);
}
//判断第二位
switch(DTC1[1]-48)
{
case 0:
byte2=0x00;
break;
case 1:
byte2|=(1<<4);
break;
case 2:
byte2|=(1<<5);
break;
case 3:
byte2|=(1<<4);
byte2|=(1<<5);
break;
default:
printf("您输入的数据有误!");
}
//********判断字符是数字还是字母************
int B2,B3,B4,B5,B6;
for(int j=1;j++,j<7;)
{
if((48<=DTC1[j])&&(DTC1[j]<=57))
{
switch(j)
{
case 2:B2=48;break;
case 3:B3=48;break;
case 4:B4=48;break;
case 5:B5=48;break;
case 6:B6=48;break;
}
}
else if((65<=DTC1[j])&&(DTC1[j]<=90))
{
switch(j)
{
case 2:B2=55;break;//'A'=65
case 3:B3=55;break;
case 4:B4=55;break;
case 5:B5=55;break;
case 6:B6=55;break;
}
}
}
//*************第三位*********************
byte2+=(DTC1[2]-B2);
//printf("DTCHighByte=%#x\n",byte2);
//************第四第五位******************
byte1+=(DTC1[3]-B3)<<4;//移位优先级最低
byte1+=(DTC1[4]-B4);
//printf("DTCMiddleByte=%#x\n",byte1);
//************DTClowByte*****************
byte0+=(DTC1[5]-B5)<<4;
byte0+=(DTC1[6]-B6);
//printf("DTCLowByte=%#X\n",byte0);//%#x带#表示带“0x”
/*%X 不输出前导零。改用 %02X;2表示至少输出2位数字,0表示'0'填充左侧的输出字符,如果输出少于 2 位。*/
printf("DTC_%02X%02X%02X\n",byte2,byte1,byte0);//X表示大写x表示小写
}