一、读取符合条件的DTC数量
通过调用19服务的01子功能,我们可以轻松地读取符合特定条件的故障码数量。重要的是要意识到,此功能仅提供故障码的数量,而不包含任何额外的信息。这意味着,虽然你可以获得故障码的总数,但不会得到关于这些故障码的详细描述或其他相关数据。
1.请求报文
该子功能也比较简单,请求格式如下:
该子功能的请求非常简洁,仅包含三个字节。以下是请求格式的详细说明:
- 服务编号:请求的第一个字节是服务编号。这是指定要执行的服务的关键标识符。
- 子功能编号:第二个字节是子功能编号,此处为01。值得注意的是,01和02子功能的请求格式是相同的,因此它们被合并在一起展示。
- DTC状态掩码(DTCStatusMask):请求的第三个字节是DTC状态掩码。这个掩码用于指定你想要查询的故障码的状态。虽然这里不详细说明其具体功能和使用方法,但它是请求中不可或缺的一部分,用于精确地获取所需的故障码信息。
通过这种简洁的请求格式,你可以高效地获取故障码的数量。
2.响应报文
响应格式同样遵循简洁的设计原则,具体如下:
- 响应服务标识符(SID):响应的第一个字节是响应的服务标识符(SID),其值为59。这个值是固定的,用于标识响应的来源。
- 子功能编号:第二个字节表示请求的子功能编号。在这里,我们可以看到两个子功能(01和07)使用相同的响应格式。由于我们的请求是针对子功能01,因此响应中的这个字节将是01。
- 支持的状态编码:第三个字节代表ECU支持的状态编码。这些编码定义了ECU能够识别和报告的故障码状态。具体的细节和解释可以在上一篇文章中找到。
- ECU支持的故障码格式:第四个字节描述了ECU支持的故障码格式。了解这些格式对于正确解析和利用故障码至关重要。详细的说明和格式定义请参考第十七篇文章。
- 符合状态的DTC个数:最后两个字节表示符合请求状态DTC状态掩码(DTCStatusMask)的DTC(诊断故障码)个数。例如,在上一篇文章中提到的示例中,这个参数的结果是2,意味着有2个故障码符合指定的状态。
UDS诊断系列之十七 谈谈故障码(DTC)
UDS诊断系列之十八故障码的状态掩码
二、读取符合条件的DTC
与读取故障码数量的子功能01相似,子功能02同样基于请求状态DTC状态掩码(DTCStatusMask)来筛选内容。然而,两者的主要区别在于02子功能要求ECU返回的是实际的DTC(诊断故障码)信息,而不仅仅是数量。
1.响应格式
与子功能01类似,子功能02也用于读取符合特定请求状态DTCStatusMask的故障码(DTC)。然而,02子功能的独特之处在于它要求ECU返回实际的DTC信息。以下是响应格式的详细说明:
- 服务响应ID:响应的第一个字节是服务响应ID,其值为59。
- 子功能编号:第二个字节是请求的子功能编号。在这个例子中,我们可以看到0A,这表明除了02子功能外,读取所有DTC的子功能也使用相同的响应格式。
- 支持的状态编码:第三个字节表示ECU支持的状态编码。这些编码详细描述了ECU能够识别的故障码状态。具体信息可以在之前的文章中找到。
- DTC信息:剩余的数据部分按照DTC的格式进行排列,每组4个字节。每组的前三个字节是DTC编号,而最后一个字节表示DTC的状态。有多少个符合请求条件的DTC,就会有多少组这样的数据。
- DTC编号:每组的前三个字节用于标识具体的DTC。
- DTC状态:每组的第四个字节描述了DTC的当前状态。
- 无匹配故障码的情况:如果未找到匹配的故障码,响应将不包含DTC信息,响应长度将缩短至只有三个字节,即服务响应ID、子功能编号和支持的状态编码。
三、读取所有的DTC
最后说一下这个最简单的读取所有DTC的子功能0A。
1.请求格式
尽管子功能0A的响应格式与02子功能相同,但它们的子功能编号不同,这意味着它们可能服务于不同的目的或条件。在这种情况下,我们主要说一下子功能0A的请求格式,它非常简洁:
- 服务ID:请求的第一个字节是服务ID,其值为19。
- 子功能编号:第二个字节是子功能编号,此处为0A。