转载来自:https://zhuanlan.zhihu.com/p/33995635 张丁
还有个公众号汽车诊断
这篇文章介绍一下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为例,它的诊断请求格式是:
0x23服务的请求格式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这几个特殊操作,使用场景不多,我组织组织语言,在下篇文章里简要介绍一下。