UDS 诊断教程 (四)
这篇文章介绍一下 UDS 的第二类诊断服务,即 Data Transmission (数据传输) (数据传输)。这类诊断服务包括
以下 SID:
ReadDataByIdentifier (0x22)
ReadMemoryByAddress (0x23)
ReadScalingDataByIdentifier (0x24)
ReadDataByPeriodicIdentifier (0x2A)
DynamicallyDefineDataIdentifier (0x2C)
WriteDataByIdentifier (0x2E)
WriteMemoryByAddress (0x3D)
通常,0x22 和 0x2E 成对使用,0x23 和 0x3D 成对使用,这几个服务用于诊断数据的基本读写操作。
0x24,0x2A,0x2C 是一些特殊操作。
0x22 和 和 0x2E 这两个服务是对以 标识符(identifier)标记的数据的操作,前者是读,后者是写。UDS 规定,
诊断数据使用两个 byte 的标识符来标记,比如,0xF187 用来标记 ECU 的零件号,0xF19E 用于标记该
ECU 所使用的诊断文件的名字,UDS 还规定了厂家可以自定义的标识符范围。这两个服务的用法很简单,
下面我以读取 ECU 的零件号为例说明:
22 F1 87 (读取零件号)
62 F1 87 XX YY ZZ KK MM NN(给出零件号)
具体每次可以使用 22 服务读取几个 ID,每个 ID 的读写权限(比如在哪些 session 中可以读写,是否需
要安全访问操作等),由厂家自定义。假设零件号这个 ID 是可以写入的话,则写零件号的诊断命令是:
2E F1 87 XX YY ZZ KK MM NN(写入零件号)
6E F1 87(给出 positive response)
0x23 和 和 0x3D 这两个服务是对以地址信息(memoryAddress )标记的数据的操作,前者是读,后者是
写。这个命令的格式稍微复杂一点。以 0x23 为例,它的诊断请求格式是:

第一部分固定为 1 个 byte, 0x23;
第二部分是格式信息,长度为 1 个 byte,
高 4 bits 用于指示 memorySize 的长度(字节数),低 4 bits
用于指示 memoryAddress 的长度(字节数)。比如,如果这个值为 0x46,则后面的 memorySize 为 6
个 byte,memoryAddress 为 4 个 byte。
第三部分是 memoryAddress 信息,它的长度由第二部分的 AddressAndLengthFormatIdentifier 指示。
第四部分是 memorySize 信息,它的长度由第二部分的 AddressAndLengthFormatIdentifier 指示。
如果这条命令的格式是 23 22 xx yy aa bb,则它的含义就是,读取 xx yy 地址的长度为 aa bb 的数据。
了解了 0x23 的用法,0x3D 的用法就很好理解了,它标识 memoryAddress 和 memorySize 的方法与
0x23 相同,只是在诊断命令最后再加上一段需要写入的数据。
0x24,0x2A,0x2C 这几个特殊操作,使用场景不多,我组织组织语言,在下篇文章里简要介绍一下。