UDS协议中的0x19(ReadDTCInformation)服务是读取DTC信息服务,DTC是Diagnostic Trouble Code的简称,意思是诊断故障代码,DTC一般包含三字节数据。
$19服务包含28个子服务(Sub-Function),常用的子服务有01、02、04、06、0A子服务。
子服务功能简介:
01:读取符合掩码条件的DTC数量,这里的掩码由客户端定义,跟在子服务序号后面,掩码为01表示读取当前故障,08表示读取历史故障,09表示读取全部故障。
02:读取符合掩码条件的DTC列表及其状态,这里的掩码同01子服务定义相同,跟在子服务序号后面。
04:读取DTC快照信息,即与DTC关联的已存储数据记录。
06:读取扩展信息。
0A:读取ECU支持的所有DTC列表及其状态,这个服务不需要掩码。
下面以CAN通信为基础讲解$19 02子服务:
首先,外部诊断仪发送服务请求,CAN报文可以为03 19 02 09 00 00 00 00,CAN报文包含八个字节的数据,其中第一字节03中的0表示此帧为单帧,3表示后面三个字节数据有效,19是ReadDTC服务,02表示子服务,09为掩码。
在积极响应的情况下,客户端可能会收到10 xx 59 02 xx xxxx...,这里的可能是因为DTC信息量会影响CAN收到的是单帧还是多帧,如果是多帧,那么首帧开头的第一个数字1表示首帧,接下来的三个数字表示客户端接收的字节数,例如10 63即表示后续接收0*16*16+6*16+3*1=99字节数据,注意这里是16进制,后续的59表示回复服务,02对应请求服务报文中的02子服务序号,02后的xx表示ECU支持的置1位,若为FF即表示支持全部位置1,报文中的xxxx部分即为DTC信息。
一个DTC包含三字节数据与一字节的状态,这个状态字节的每一位都定义了DTC的不同状态,参考:DTC状态位解析