2E服务-WriteDataByIdentifier

48 篇文章 22 订阅 ¥129.90 ¥99.00

诊断协议那些事儿

诊断协议那些事儿专栏系列文章,本文介绍数据传输服务下的2E服务WriteDataByIdentifier,允许客户端在通过提供的dataidentifier数据标识符指定的内部位置将信息写入服务器。
2E

参考文章:
数据传输功能单元——DID参数定义
22服务-ReadDataByIdentifier



一、2E服务-WriteDataByIdentifier

WriteDataByldentiffer服务允许客户端在通过提供的dataidentifier数据标识符指定的内部位置将信息写入服务器。客户端使用WriteDataByldentifier服务将dataRecord写入ECU 服务器。

数据由dataldentifier标识,可能受保护,也可能不受保护。

动态定义的dataldentifer不得与此服务一起使用。
在执行此服务时,满足服务器条件是车辆制造商的责任。该服务的可能用途是∶
-将配置信息编程到服务器中(例如VIN码),
-清除非易失性存储器,
-重置学习值,
-设置选项内容。
注意∶服务器可能会限制或禁止对某些dataldentffer值的写访问(由系统供应商/车辆制造商定义的只读标识符等)。

二、请求格式

req
dataIdentifier-数据标识符,本参数确定了客户端请求写入的服务器数据记录
dataRecord-数据记录,本参数提供了与客户端请求写入的DID相关的数据记录。

注:本服务不适用子功能参数!

三、肯定响应格式

rsp

四、否定响应格式

1.支持的否定响应码

NRC描述助记符
0x13请求报文的数据长度(或者格式)不符合标准IMLOIF
0x22条件不正确CNC
0x31①请求消息中的DID在服务器中不受支持或DID仅只读(22服务受支持);②在DID后的请求消息中传输的任何数据是无效的;ROOR
0x33安全访问被拒绝:若至少有一个DID已受保护,并且服务器未处于解锁状态SAD
0x72一般编程故障:在写入一个存储单元时服务器检测到错误GPF

2.NRC优先级

NRC

五、消息流示例

本示例描述通过一个两字节DID:0xF190进行VIN编写的过程

写DID(0xF190——VIN码)

wrie
肯定响应消息流:
rsp2


总结

以上就是今天要讲的内容,欢迎各位评论,提出宝贵意见,小编也会持续更新,以提供更好的作品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 UDS(Unified Diagnostic Services,统一诊断服务)协议层的实现代码,使用了可维护性较高的架构: ```c++ // UDS.h #ifndef UDS_H #define UDS_H #include <stdint.h> class UDS { public: UDS(); virtual ~UDS(); enum class ErrorCode : uint8_t { NoError = 0x00, InvalidService = 0x11, InvalidSubFunction = 0x12, BusyRepeatRequest = 0x21, ConditionsNotCorrect = 0x22, RequestOutOfRange = 0x31, SecurityAccessDenied = 0x33, InvalidKey = 0x35, ExceededNumberOfAttempts = 0x36, RequiredTimeDelayNotExpired = 0x37, UploadDownloadNotAccepted = 0x70, TransferDataSuspended = 0x71, GeneralProgrammingFailure = 0x72, WrongBlockSequenceCounter = 0x73, RequestCorrectlyReceivedResponsePending = 0x78, SubFunctionNotSupportedInActiveSession = 0x7E, ServiceNotSupportedInActiveSession = 0x7F, ServiceNotSupported = 0x80, ResponseTooLong = 0x81, Busy = 0x82, ConditionsNotCorrectOrRequestSequenceError = 0x83, RoutineNotComplete = 0x84, RequestCorrectlyReceivedResponsePending2 = 0x85, SubFunctionNotSupported = 0x86, IncorrectMessageLengthOrInvalidFormat = 0x87, ResponsePending = 0x78, }; // UDS services ErrorCode requestControl(uint8_t controlType); ErrorCode startRoutine(uint16_t routineId); ErrorCode stopRoutine(uint16_t routineId); ErrorCode requestDownload(uint32_t address, uint32_t length); ErrorCode transferData(uint8_t* data, uint16_t length); ErrorCode requestUpload(uint32_t address, uint32_t length); ErrorCode readDataByIdentifier(uint16_t id, uint8_t* data, uint16_t* length); ErrorCode writeDataByIdentifier(uint16_t id, uint8_t* data, uint16_t length); }; #endif // UDS_H ``` ```c++ // UDS.cpp #include "UDS.h" UDS::UDS() {} UDS::~UDS() {} UDS::ErrorCode UDS::requestControl(uint8_t controlType) { // TODO: implement requestControl return ErrorCode::NoError; } UDS::ErrorCode UDS::startRoutine(uint16_t routineId) { // TODO: implement startRoutine return ErrorCode::NoError; } UDS::ErrorCode UDS::stopRoutine(uint16_t routineId) { // TODO: implement stopRoutine return ErrorCode::NoError; } UDS::ErrorCode UDS::requestDownload(uint32_t address, uint32_t length) { // TODO: implement requestDownload return ErrorCode::NoError; } UDS::ErrorCode UDS::transferData(uint8_t* data, uint16_t length) { // TODO: implement transferData return ErrorCode::NoError; } UDS::ErrorCode UDS::requestUpload(uint32_t address, uint32_t length) { // TODO: implement requestUpload return ErrorCode::NoError; } UDS::ErrorCode UDS::readDataByIdentifier(uint16_t id, uint8_t* data, uint16_t* length) { // TODO: implement readDataByIdentifier return ErrorCode::NoError; } UDS::ErrorCode UDS::writeDataByIdentifier(uint16_t id, uint8_t* data, uint16_t length) { // TODO: implement writeDataByIdentifier return ErrorCode::NoError; } ``` 以上代码中,`UDS` 类定义了 UDS 协议层的各个服务,每个服务都返回一个错误代码(`ErrorCode` 枚举类型)。具体服务的实现留给后续开发者完成。 在实现具体服务时,应该始终遵循 UDS 协议规范和可维护性良好的编程实践。建议使用面向对象的编程方法,将每个服务实现为一个单独的类方法,这样可以更好地分离各个服务的逻辑,减少出错的可能性。此外,编写详细的注释也是非常重要的,可以帮助其他开发者更好地理解代码并进行维护。 当然,这只是一个简单的示例代码,实际项目中还需要根据具体需求进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

诊断协议那些事儿

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值