大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是UDS诊断通过DID写入数据0X2E服务介绍,希望能对你有所帮助
一、写数据服务介绍
简单来说的话,0X2E写数据服务是通过DID向服务端写入相关数据的
来看看官方文档ISO14229-1的介绍
这段文字的意思为:
1,0X2E服务允许客户端通过数据标识符(DID)将信息写入内部指定位置的服务器
2,0X2E服务由客户端将数据(dataRecord)写入服务端,也就是ECU,数据由DID标识,可能要过安全访问,可能不要
3,动态定义的DID(至于啥是动态定义的DID咱也不知道哇,暂时没用到过,可看一下0X2C服务)在这个服务是不能用的。车辆制造商有责任在执行次服务时,要满足服务端的条件。
这个服务主要用来:
-
将配置信息写入服务端,例如VIN(Vehicle Identification Number),车辆识别码
-
清除NVM(non-volatile memory),NVM就是非易失性内存,如RON,flash,掉电不丢失
-
复位之前设置的值
-
设置可选项
注意:服务器可以限制或禁止对某些DID的值(由系统供应商/车辆制造商定义)进行访问
二、数据格式
2.1 请求报文
请求格式:[SID] + [DID] + [dataRecord],这个服务跟0X22一样,也是没有sub-function这个参数
0X22是通过DID读数据,0X2E是通过DID写数据
2.2 响应报文
响应报文格式:[SID + 0X40] + [DID] ,所有服务的响应基本都是这个格式,相信各位现在应该对这个很熟了
注意:响应的DID和请求报文中的DID要保持一致,就跟之前一些服务的那个子功能参数一样,响应的时候子功能也要和请求的子功能保持一致。
2.3 否定响应
否定响应的格式:[0X7F] + [SID] + [NRC]
0X13:请求的消息长度不正确,或格式错误
0X22:条件不正确,就是不满足服务端的运行条件
0X31:不支持当前请求的DID,或请求的DID为只读;用一个无效的DID请求传输数据
0X33:没有过安全访问,需要先执行27服务解密后,才能执行22服务
0X72:在写入时,内存出错
这里说一下NRC的优先级问题,当一个服务有很多个NRC都满足时,该上报哪一个NRC呢,此时就看哪个NRC的优先级更高了
举个例子,如果0X2E服务在执行时,长度不对,没过安全访问,服务端执行的条件也不满足,那否定响应上报的NRC只报0X13,因为优先级:0X13 > 0X33 > 0X22
这里的NRC优先级,客户应该会参考ISO14229给一个总的NRC的优先级,每个客户可能会稍微不一样。我负责的其中一个项目的NRC优先级如下:
2.4 常见的DID
此处只截了一部分,完整DID表,请参考ISO14229-1的 Table C.1 — DID data-parameter definitions
三、举例子
第一次2E F1 90 00服务是在默认会话下请求的,所以NRC报7F,当前会话不支持
0X22服务在默认会话下也能执行,也不需要过安全访问,所以就能读到
等执行 10 03切到扩展会话后,再执行0X2E服务,NRC报33,表示没过安全访问,得先执行0X27服务解密
最后一次执行0X2E服务,切到了扩展会话模式,也过了安全访问,NRC报13,表示请求的消息长度不正确。因为DID:F1 90是VIN码,由17个字节组成,但发送的时候,只发了一个字节。
注意:在需要切到扩展会话执行相关的服务时,最好周期性发送0X3E服务,否则,手速慢了,还未执行完对应的服务,就又回到默认会话模式,这样也会回复否定响应
写成功的例子:
10:表示首帧,14表示数据长度为20(0X14转十进制),2E F1 90 加上17个字节的VIN就是20字节
30:表示流控帧
21:2表示连续帧,1表示连续帧的第一帧;同理22就是连续帧的第二帧
这里介绍一下VIN码是啥,VIN(Vehicle Identification Number),车辆识别码,由17个字节组成,格式如下:
最后,如果觉得有帮助,希望你能点个关注,一键三连,感激不尽
[…] 0X2E服务:UDS统一诊断服务【九】通过ID写入数据0X2E服务 […]