转载:https://blog.csdn.net/qq_40242571/article/details/121007310
WriteDataByIdentifier就是通过标识符写入数据服务,这里的标识符(ID)指的是数据标识符,也就是我们经常说的DID。
目录
服务 | 描述 |
WriteDataByIdentifier | 客户端向服务端请求写入一个DID对应标识的数据记录值。 |
1.英文术语
英文术语 | 翻译 |
WriteDataByIdentifier | 通过标识符写入数据 |
WriteDataByIdentifier Request SID | 通过标识符写入数据请求SID ISO14229定义此值为0x2E |
WriteDataByIdentifier Response SID | 通过标识符写入数据响应SID ISO14229定义此值为(0x2E+0x40) |
dataIdentifier | 数据标识符,缩写为DID |
2.缩写表
缩写 | 解释 |
SID | 服务标识符 |
DID | 数据标识符 |
Cvt | 约定值 M 强制的 C 有条件的 U 用户选项 |
NRC | 否定响应码 |
3.服务描述
通过标识符写入数据服务就是向对应的数据标识符写入数据记录值。
通过标识符写入数据服务重点知识:
- 该服务请求中只能有一个DID;
- 对于某些特定的DID,可以设置在某个安全等级下访问或某个诊断会话模式下访问;
- 使用此服务写入数据时,可以设置某些前提条件(譬如:车速为0km/h);
- 对于某些特定的DID,可以禁止写访问,所以这些DID不能使用此服务写入(譬如:动态定义的DID读写属性是只读);
通过标识符写入数据服务可能用途:
- 将配置信息写入到服务器,如:VIN码;
- 清除非易失性存储器;
- 重置学习值;
- 设置选项类型(对某些数据设置选项,以供选择运行)
4.请求消息定义
请求消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 通过标识符写入数据请求SID | M | 0x2E | WDBI |
#2 #3 | DID[]= [ 字节#1(MSB) 字节#2] | M M | 0x00-0xFF 0x00-0xFF | DID_ HB LB |
#4 : #m+3 | 数据记录[]= [ 字节#1(MSB) 字节#2] | M : U | 0x00-0xFF 0x00-0xFF | DREC_ DATA_1 : DATA_m |
4.1.请求消息子功能定义
该服务不使用子功能参数。(肯定也没有抑制肯定响应位,因为没有子功能参数)
4.2.请求消息数据参数定义
请求消息数据参数定义 |
定义 |
DID 此参数标识服务端的数据记录值。譬如:某协议定义了DID = 0xF190,标识了服务端的VIN码。 简单说此参数就是一个标识。 注:有关DID参数定义,可查阅 |
数据记录 此参数是客户端向服务端请求写入的关联DID所标识的数据记录值,此数据记录值由车辆制造商定义 |
5.肯定响应消息定义
肯定响应消息定义 | ||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 |
#1 | 通过标识符写入数据响应SID | M | 0x6E | WDBIPR |
#2 #3 | DID[]#1 = [ 字节#1(MSB) 字节#2] | M M | 0x00-0xFF 0x00-0xFF | DID_ HB LB |
5.1.肯定响应消息数据参数定义
肯定响应消息数据参数定义 |
定义 |
DID 此参数标识服务端的数据记录值,是与上面的请求消息中的DID相同。譬如:某协议定义了DID = 0xF190,标识了服务端的VIN码。 |
6.否定响应消息定义
否定响应消息定义 | |||||
A_Data字节 | 参数名称 | Cvt | 字节值 | 助记符 | |
#1 | 否定响应SID | M | 0x7F | SIDNR | |
#2 | 通过标识符写入数据请求SID | M | 0x2E | SIDRQ | |
#3 | 否定响应码 | M | 0xXX | NRC_ |
6.1.否定响应码
此服务支持的否定响应码 | ||
否定响应码 | 描述 | 助记符 |
0x13 | 消息长度错误或格式无效 如果消息的长度错误,则应发送此否定响应码。 | IMLOIF |
0x22 | 条件不正确 如果服务端不满足条件,就无法清除储存在服务端中的DTC相关信息,则应返回此NRC。 | CNC |
0x31 | 请求超出范围 以下情况下,应发送该NRC: ——设备不支持所请求的DID值; ——当前会话中不支持所请求的DID; ——该DID设置的读写属性是只读; | ROOR |
0x33 | 安全访问被拒绝 如果请求写入的DID有一个需要进行安全访问,此时服务端若处于非解锁状态或非对应的解锁状态下,则应返回此NRC。 | SAD |
0x72 | 通用编程失败 如果服务端在写入存储器(根据地址写)时检测到错误,则应返回此NRC。 | GPF |
6.2.NRC评估序列
7.服务使用示例
7.1.示例#1-写入数据标识符0xF190(VIN码)
7.1.1.步骤1:请求通过标识符写入数据
譬如:在某个协议中定义,该数据标识符0xF190包含VIN码。
通过标识符写入数据请求消息 | ||||
消息方向 | 客户端→服务端 | |||
消息类型 | 请求 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 通过标识符写入数据请求SID | 0x2E | WDBI | |
#2 #3 | DID[]= [ 字节#1(MSB) 字节#2] | 0xF1 0x90 | DID_B1 DID_B2 | |
#4 #5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20 | 数据记录[] = [ 数据#1 = VIN数字1 ="W" 数据#2 = VIN数字2 ="O" 数据#3 = VIN数字3 ="L" 数据#4 = VIN数据4 ="O" 数据#5 = VIN数据5 ="O" 数据#6 = VIN数据6 ="O" 数据#7 = VIN数据7 ="O" 数据#8 = VIN数据8 ="4" 数据#9 = VIN数据9 ="3" 数据#10 = VIN数据10 ="M" 数据#11 = VIN数据11 ="B" 数据#12 = VIN数据12 ="5" 数据#13 = VIN数据13 ="4" 数据#14 = VIN数据14 ="1" 数据#15 = VIN数据15 ="3" 数据#16 = VIN数据16 ="2" 数据#17 = VIN数据17 ="6"] | 0x57 0x30 0x4C 0x30 0x30 0x30 0x30 0x34 0x33 0x4D 0x42 0x35 0x34 0x31 0x33 0x32 0x36 | DREC_DATA1 DREC_DATA2 DREC_DATA3 DREC_DATA4 DREC_DATA5 DREC_DATA6 DREC_DATA7 DREC_DATA8 DREC_DATA9 DREC_DATA10 DREC_DATA11 DREC_DATA12 DREC_DATA13 DREC_DATA14 DREC_DATA15 DREC_DATA16 DREC_DATA17 |
通过标识符写入数据响应消息 | ||||
消息方向 | 服务端→客户端 | |||
消息类型 | 响应 | |||
A_Data字节 | 描述(所以值为16进制) | 字节值 | 助记符 | |
#1 | 通过标识符读取数据响应SID | 0x6E | WDBIPR | |
#2 #3 | DID[] = [ 字节#1(MSB) 字节#2] | 0xF1 0x90 | DID_B1 DID_B2 |
7.1.2.操作汇总
步骤1:请求通过标识符读取数据
图解:
注:超过8字节数据使用首帧和连续帧进行拆解。
操作 | CAN报文 | 实体 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
请求通过标识符写入数据(首帧) | 0x10 | 0x14 | 0x2E | 0xF1 | 0x90 | 0x57 | 0x30 | 0x4C | 客户端 |
流控帧(服务端自动发出) | 0x30 | 0x08 | 0x0A | 服务端 | |||||
请求通过标识符写入数据(连续帧) | 0x21 | 0x30 | 0x30 | 0x30 | 0x30 | 0x34 | 0x33 | 0x4D | 客户端 |
请求通过标识符写入数据(连续帧) | 0x22 | 0x42 | 0x35 | 0x34 | 0x31 | 0x33 | 0x32 | 0x36 | 客户端 |
肯定响应 | 0x03 | 0x6E | 0xF1 | 0x90 | 服务端 |
到这里我们的0x2E服务基本学完了。
以上解释有没有解决大家的疑惑,如果还是觉得有疑惑的地方,欢迎大家踊跃提出,一起分享,共同进步!!!
有CSDN号的也可以帮忙点个关注,我会陆续更新其它UDS服务。