汽车UDS诊断之通过标识符写入数据服务(0x2E)深度剖析

本文深入剖析了UDS(统一诊断服务)中的0x2E服务,即通过数据标识符写入数据。内容涵盖了服务描述、请求与响应消息定义、否定响应码以及服务使用示例,特别是如何写入VIN码。文章强调了服务的限制,如只能写入一个DID,并探讨了其可能的应用场景,如配置信息写入和重置学习值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WriteDataByIdentifier就是通过标识符写入数据服务,这里的标识符(ID)指的是数据标识符,也就是我们经常说的DID

目录

1.英文术语

2.缩写表

3.服务描述

4.请求消息定义

4.1.请求消息子功能定义

4.2.请求消息数据参数定义

5.肯定响应消息定义

5.1.肯定响应消息数据参数定义

6.否定响应消息定义

6.1.否定响应码

6.2.NRC评估序列

7.服务使用示例

7.1.示例#1-写入数据标识符0xF190(VIN码)

7.1.1.步骤1:请求通过标识符写入数据

7.1.2.操作汇总


通过标识符写入数据
服务描述
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通过标识符写入数据请求SIDM0x2EWDBI

#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通过标识符写入数据响应SIDM0x6EWDBIPR

#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否定响应SIDM0x7FSIDNR
#2通过标识符写入数据请求SIDM0x2ESIDRQ
#3否定响应码M0xXXNRC_

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 ="0"

                          数据#3 = VIN数字3 ="L"

                          数据#4 = VIN数据4 ="0"

                          数据#5 = VIN数据5 ="0"

                          数据#6 = VIN数据6 ="0"

                          数据#7 = VIN数据7 ="0"

                          数据#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报文实体
01234567
请求通过标识符写入数据(首帧)0x100x140x2E0xF1

0x90

0x570x300x4C客户端
流控帧(服务端自动发出)0x300x080x0A服务端
请求通过标识符写入数据(连续帧)0x210x300x300x300x300x340x330x4D客户端
请求通过标识符写入数据(连续帧)

0x22

0x420x350x340x310x330x320x36客户端
肯定响应0x030x6E

0xF1

0x90服务端

到这里我们的0x2E服务基本学完了。

以上解释有没有解决大家的疑惑,如果还是觉得有疑惑的地方,欢迎大家踊跃提出,一起分享,共同进步!!!

有CSDN号的也可以帮忙点个关注,我会陆续更新其它UDS服务

### CAN通信返回0x31原因分析 当CAN通信中的节点接收到请求并返回0x31时,这表明发生了特定类型的否定响应。具体来说: - 否定响应由三部分组成:固定的否定响应前缀`0X7F`,诊断服务ID(SID),以及NRC错误码`0X&&`[^1]。 - 对于0x31这一具体的NRC代码,意味着请求超出了有效范围。特别是对于某些子功能而言,可能是因为传入的参数值不在预期范围内。例如,在涉及`communicationType`参数的情况下,如果其值不是位于0x01到0x03之间,则会触发此错误;同样地,对于支持0x04和0x05子功能的服务,若`nodeIdentificationNumber`参数无效也会导致同样的结果[^2]。 ### 解决方案建议 为了处理这种情况,可以采取如下措施来排查和解决问题: #### 参数验证 确保发送给目标设备的所有命令都包含了合法有效的参数。特别是在设置`communicationType`或其他敏感字段之前,仔细查阅相关文档确认允许使用的取值区间,并严格遵循这些规定。 #### 日志记录与调试工具的应用 利用专业的汽车网络分析仪或集成开发环境内的调试特性捕获完整的交互过程日志。通过这种方式能够更直观地观察实际传输的数据流,从而更容易定位问题所在之处。 #### 测试用例设计 构建一系列全面覆盖各种边界条件下的测试场景,包括但不限于最小/最大输入值、默认配置选项等极端情况。这样做有助于提前发现潜在缺陷,并提高系统的鲁棒性和兼容性。 ```python def validate_parameters(communication_type, node_id=None): valid_communication_types = range(0x01, 0x04) # Assuming only these values are allowed if communication_type not in valid_communication_types: raise ValueError(f"Invalid communication type {hex(communication_type)}. Expected value between 0x01 and 0x03.") if node_id is not None and (not isinstance(node_id, int) or node_id < 0 or node_id > 255): raise ValueError("Node ID must be an integer within the byte range.") # Example usage of function to prevent sending invalid parameters leading to NRC=0x31 errors. validate_parameters(0x02, 0xFF) ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心骗小白话

和我一起成长吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值