统一诊断服务 (Unified diagnostic services , UDS) (四)

转载来自: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这几个特殊操作,使用场景不多,我组织组织语言,在下篇文章里简要介绍一下。

posted @ 2020-07-02 15:35  冰糖葫芦很乖  阅读(573)  评论(0编辑  收藏  举报