ReadDataByIdentifier就是通过标识符读取数据服务,这里的标识符(ID)指的是数据标识符,也就是我们经常说的DID。
目录
7.1.示例#1-读取单个数据标识符0xF190(VIN码)
7.2.示例#2-读取多个数据标识符0x010A和0x0110
服务 | 描述 |
ReadDataByIdentifier | 客户端向服务端请求获取一个或多个DID标识的数据记录值。 |
1.英文术语
英文术语 | 翻译 |
ReadDataByIdentifier | 通过标识符读取数据 |
ReadDataByIdentifier Request SID | 通过标识符读取数据请求SID ISO14229定义此值为0x22 |
ReadDataByIdentifier Response SID | 通过标识符读取数据响应SID ISO14229定义此值为(0x22+0x40) |
dataIdentifier | 数据标识符,缩写为DID |
dataRecord | 数据记录 |
2.缩写表
缩写 | 解释 |
SID | 服务标识符 |
DID | 数据标识符 |
Cvt | 约定值 M 强制的 C 有条件的 U 用户选项 |
NRC | 否定响应码 |
3.服务描述
通过标识符读取数据服务就是用来获取数据标识符所对应的数据记录值的,对于服务端来说,客户端可向服务端一次请求一个或多个数据标识符。
通过标识符读取数据服务重点知识:
- 服务端可以限制请求数据标识符的数量,此数量由车辆制造商和系统供应商协商一致
- 对于某些特定的DID,可以设置在某个安全等级下访问或某个诊断会话模式下访问。
- 数据记录值的格式和定义需要车辆制造商或系统供应商指定的。
4.请求消息定义
请求消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 通过标识符读取数据请求SID | M | 0x22 | RDBI |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | M M | 0x00-0xFF 0x00-0xFF | DID_ HB LB |
: | : | : | : | : |
#2m #2m+1 | DID[]#m = [ 字节#1(MSB) 字节#2] | U U | 0x00-0xFF 0x00-0xFF | DID_ HB LB |
4.1.请求消息子功能定义
该服务不使用子功能参数。(肯定也没有抑制肯定响应位,因为没有子功能参数)
4.2.请求消息数据参数定义
请求消息数据参数定义 |
定义 |
DID(#1 to #m) 此参数标识服务端的数据记录值。譬如:某协议定义了DID = 0xF190,标识了服务端的VIN码。 |
5.肯定响应消息定义
肯定响应消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 通过标识符读取数据响应SID | M | 0x62 | RDBIPR |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | M M | 0x00-0xFF 0x00-0xFF | DID_ HB LB |
#4 : #(k-1)+4 | 数据记录[]#1 = [ 数据#1 : 数据#k] | M : U | 0x00-0xFF : 0x00-0xFF | DREC_ DATA_1 : DATA_k |
: | : | : | : | : |
#n-(o-1)-2 #n-(o-1)-1 | DID[]#m = [ 字节#1(MSB) 字节#2] | U U | 0x00-0xFF 0x00-0xFF | DID_ HB LB |
#n-(o-1) : #n | 数据记录[]#m = [ 数据#1 : 数据#o] | U : U | 0x00-0xFF : 0x00-0xFF | DREC_ DATA_1 : DATA_o |
5.1.肯定响应消息数据参数定义
肯定响应消息数据参数定义 |
定义 |
DID(#1 to #m) 此参数标识服务端的数据记录值,是与上面的请求消息中的DID相同。譬如:某协议定义了DID = 0xF190,标识了服务端的VIN码。 |
数据记录(#1 to #k/o) 该参数向客户端提供所请求的数据记录值,此数据记录值由车辆制造商定义 |
6.否定响应消息定义
否定响应消息定义 | |||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 | |
#1 | 否定响应SID | M | 0x7F | SIDNR | |
#2 | 通过标识符读取数据请求SID | M | 0x22 | SIDRQ | |
#3 | 否定响应码 | M | 0xXX | NRC_ |
6.1.否定响应码
此服务支持的否定响应码 | ||
否定响应码 | 描述 | 助记符 |
0x13 | 消息长度错误或格式无效 如果消息的长度错误,则应发送此否定响应码。 | IMLOIF |
0x14 | 响应过长 如果响应消息的总长度超过底层传输协议的限制(例如,当单个请求中请求多个DID时),则发送该NRC。 | RTL |
0x22 | 条件不正确 如果服务端不满足条件,就无法清除储存在服务端中的DTC相关信息,则应返回此NRC。 | CNC |
0x31 | 请求超出范围 以下情况下,应发送该NRC: ——设备不支持所请求的DID值; ——当前会话中不支持所请求的DID; ——所请求的动态定义DID尚未分配。 | ROOR |
0x33 | 安全访问被拒绝 如果请求读取的DID有一个需要进行安全访问,此时服务端若处于非解锁状态或非对应的解锁状态下,则应返回此NRC。 | SAD |
7.服务使用示例
7.1.示例#1-读取单个数据标识符0xF190(VIN码)
7.1.1.步骤1:请求通过标识符读取数据
譬如:在某个协议中定义,该数据标识符0xF190包含VIN码。
通过标识符读取数据请求消息 | ||||
消息方向 | 客户端→服务端 | |||
消息类型 | 请求 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 通过标识符读取数据请求SID | 0x22 | RDBI | |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | 0xF1 0x90 | DID_B1 DID_B2 |
通过标识符读取数据响应消息 | ||||
消息方向 | 服务端→客户端 | |||
消息类型 | 响应 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 通过标识符读取数据响应SID | 0x62 | RDBIPR | |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | 0xF1 0x90 | DID_B1 DID_B2 | |
#4 #5 #6 #7 #8 #9 #10 | 数据记录[]#1 = [ 数据#1 = VIN数字1 = "W" 数据#2 = VIN数字2 = "0" 数据#3 = VIN数字3 = "L" 数据#4 = VIN数字4 = "0" 数据#5 = VIN数字5 = "0" 数据#6 = VIN数字6 = "0" 数据#7 = VIN数字7 = "0"] | 0x57 0x30 0x4C 0x30 0x30 0x30 0x30 | DREC_DATA1 DREC_DATA2 DREC_DATA3 DREC_DATA4 DREC_DATA5 DREC_DATA6 DREC_DATA7 |
7.1.2.操作汇总
步骤1:请求通过标识符读取数据
图解:
注:超过8字节数据使用首帧和连续帧进行拆解。
操作 | CAN报文 | 实体 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
请求通过标识符读取数据 | 0x03 | 0x22 | 0xF1 | 0x90 | 客户端 | ||||
肯定响应(首帧) | 0x10 | 0x0A | 0x62 | 0xF1 | 0x90 | 0x57 | 0x30 | 0x4C | 服务端 |
流控帧 | 0x30 | 0x01 | 0x0A | 客户端 | |||||
肯定响应(连续帧) | 0x21 | 0x30 | 0x30 | 0x30 | 0x30 | 服务端 |
7.2.示例#2-读取多个数据标识符0x010A和0x0110
7.2.1.步骤1:请求通过标识符读取数据
譬如:在某个协议中定义,
该数据标识符0x010A包含发动机冷却液温度、油门位置、发动机转速、进气歧管绝对压力、空气质量流量、车速传感器、气压、负载、怠速控制器、油门踏板位置。
该数据标识符0x0110包含电池正电压。
通过标识符读取数据请求消息 | ||||
消息方向 | 客户端→服务端 | |||
消息类型 | 请求 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 通过标识符读取数据请求SID | 0x22 | RDBI | |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | 0x01 0x0A | DID_B1 DID_B2 | |
#4 #5 | DID[]#2 = [ 字节#1(MSB) 字节#2] | 0x01 0x10 | DID_B1 DID_B2 |
通过标识符读取数据响应消息 | ||||
消息方向 | 服务端→客户端 | |||
消息类型 | 响应 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 通过标识符读取数据响应SID | 0x62 | RDBIPR | |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | 0x01 0x0A | DID_B1 DID_B2 | |
#4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 | 数据记录[]#1 = [ 数据#1 = ECT 数据#2 = TP 数据#3 = RPM 数据#4 = RPM 数据#5 = MAP 数据#6 = MAF 数据#7 = VSS 数据#8 = BARO 数据#9 = LOAD 数据#10 = IAC 数据#11 = APP] | 0xA6 0x66 0x07 0x50 0x20 0x1A 0x00 0x63 0x4A 0x82 0x7E | DREC_DATA1 DREC_DATA2 DREC_DATA3 DREC_DATA4 DREC_DATA5 DREC_DATA6 DREC_DATA7 DREC_DATA8 DREC_DATA9 DREC_DATA10 DREC_DATA11 | |
#15 #16 | DID[]#2 = [ 字节#1(MSB) 字节#2] | 0x01 0x10 | DID_B1 DID_B2 | |
#17 | 数据记录[]#2 = [ 数据#1 = B+] | 0x8C | DREC_DATA1 |
7.2.2.操作汇总
步骤1:请求通过标识符读取数据
图解:
注:超过8字节数据使用首帧和连续帧进行拆解。
操作 | CAN报文 | 实体 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
请求通过标识符读取数据 | 0x05 | 0x22 | 0x01 | 0x0A | 0x01 | 0x10 | 客户端 | ||
肯定响应(首帧) | 0x10 | 0x11 | 0x62 | 0x01 | 0x0A | 0xA6 | 0x66 | 0x07 | 服务端 |
流控帧 | 0x30 | 0x02 | 0x0A | 客户端 | |||||
肯定响应(连续帧SN =1) | 0x21 | 0x50 | 0x20 | 0x1A | 0x00 | 0x63 | 0x4A | 0x82 | 服务端 |
肯定响应(连续帧SN =2) | 0x22 | 0x7E | 0x01 | 0x10 | 0x8C | 服务端 |
到这里我们的0x22服务基本学完了。
以上解释有没有解决大家的疑惑,如果还是觉得有疑惑的地方,欢迎大家踊跃提出,一起分享,共同进步!!!
有CSDN号的也可以帮忙点个关注,我会陆续更新其它UDS服务。