资讯动态

UDS诊断服务-2E服务

发布时间:2026/8/5 16:19:28 来源:尧图企业网站定制
先说个比喻2E 就是往 ECU 的抽屉里塞东西你把 ECU 想象成一个有几百个抽屉的柜子。每个抽屉上贴了个标签DID抽屉里放着一样东西数据。22 服务 打开抽屉看一眼读2E 服务 打开抽屉把里面的东西换成新的写就这么简单。没了。2E 的全部报文结构一句话就能说完请求2E 哪个抽屉(DID) 塞什么东西(DataRecord) 响应6E 哪个抽屉(DID)请求没有校验位。响应没有数据回传。没有保留字节。没有批量写入。就这么多。如果你看到的任何资料里2E 的请求超过SID DID 数据这三样东西或者响应超过0x6E DID这 3 个字节——那份资料有问题。第一个坑会话编号0x02 和 0x03 你搞反了没有这是我见过最高频的错误没有之一。要写数据先切到扩展会话 0x02。停。0x02 不是扩展会话。编号它叫什么干什么用0x01defaultSession默认会话啥也干不了只能读读故障码0x02programmingSession编程会话刷固件、写 VIN、改核心标定0x03extendedDiagnosticSession扩展诊断会话2F 控制、2E 写一般参数、跑例程0x04safetySystemDiagnosticSession安全系统专用你大概率用不到记住口诀二编程三扩展。写个空调默认档位10 03切扩展会话就够了。写 VIN 码10 02切编程会话还得做安全验证。我当年在产线上写 VIN用10 03切了个扩展会话就发 2E被 ECU 一个7F 2E 7F怼回来。后来才知道 VIN 要编程会话。第二个坑你的报文是不是多塞了几个零来看一个真实场景。你要往 DID0x0200某 OEM 定义的怠速目标值写入 800rpm。800 的十六进制是 0x0320占 2 个字节。正确的请求2E 02 00 03 205 个字节。完事了。很多人包括当年的我会写成2E 02 00 03 20 00 00 008 个字节后面补了仨零凑满一帧。ECU 看到后面多出来的三个字节心想这啥玩意儿DID 定义的数据就 2 字节你给我 5 字节数据于是回你一个7F 2E 130x13 incorrectMessageLengthOrInvalidFormat。翻译成人话你报文长度不对。CAN 单帧能装 8 字节不代表你必须塞满 8 字节。报文长度 SID(1) DID(2) DataRecord(n)。多一个字节都是错的。同理响应也是正确6E 02 00 3 字节SID0x40 加 DID 回显 错误6E 02 00 00 00 00 00 00标准 2E 肯定响应就 3 个字节。不回传你写入的数据没有保留字段没有校验回显。你想验证写没写进去发个 22 去读。第三个坑别找校验位了它不存在有些资料会告诉你2E 请求的最后一个字节是可选校验位CRC8/CRC16不需要时填 0x00。这话是编的。ISO 14229-1 的 2E 服务定义里请求结构就是字段长度说明SID1 字节0x2EDID2 字节你要写哪个抽屉DataRecordn 字节你要塞进去的东西没有第四个字段。没有校验位没有保留位没有可选附加信息。如果某个 OEM 确实需要完整性校验比如写标定时要求 CRC那 CRC 是DataRecord 的一部分由 OEM 在诊断规范里定义这个 DID 的数据格式是2 字节数值 1 字节 CRC。它不是独立于 DataRecord 之外的校验字段。第四个坑一次只能写一个 DID有些资料尤其是那些喜欢编以太网增强功能的会告诉你以太网下可以单帧批量写入多个 DID。然后给你一个看起来像这样的报文2E 03 02 00 03 20 02 01 46 ...这个格式在任何版本的 ISO 14229 里都不存在。0x2E 每次请求只写一个 DID。要写三个参数发三次请求。CAN 也好DoIP 也好都是这样。2E 02 00 03 20 → 写怠速 2E 02 01 64 → 写水温阈值 2E 02 02 01 → 写空调档位三次。老老实实三次。没有捷径。第五个坑安全验证不是5 秒有效有资料这么写通过 27 服务验证后若超过 5000ms 未执行写入需重新验证。这是误导。安全访问SecurityAccess的生命周期跟会话绑定不跟秒表绑定。只要会话没断没超时、没切走、没复位ECU 没重启那你的安全访问就一直有效。5 秒、50 秒、5 分钟都行。你可能把两个东西搞混了概念超时后果典型值S3_serverTesterPresent 超时会话退回默认安全访问连带失效5000msOEM 自定义安全访问本身只要会话在就一直有效无独立超时所以不是安全验证 5 秒过期而是如果你 5 秒内没发 3ETesterPresent会话断了安全访问跟着失效。实操建议做完 27 服务后如果后续操作比较复杂比如要写好几个 DID每隔 3~4 秒发一次3E 00保活。完整的实操流程以改怠速目标值为例不写步骤一二三四了。直接上真实对话。你我要把怠速从 750 改到 800。我行。先确认三件事。你哪三件我第一DID 是多少查你的诊断规范CDD/ODX别猜。假设是 0x0200。第二数据几个字节、什么范围假设 2 字节600~1200rpm。第三需要什么权限假设要扩展会话 安全等级 0x03。你好都确认了。然后呢我走。第 1 步切会话 你发10 03 ECU回50 03 00 32 01 F4 好扩展会话已开P250msP2*500ms 第 2 步安全验证 你发27 03 ECU回67 03 AB CD 12 34 ← 种子长度由 OEM 定 你算密钥 f(种子) ← 算法在 OEM 规范里 你发27 04 56 78 9A BC ← 密钥 ECU回67 04 ← 验证通过 第 3 步写入 你发2E 02 00 03 20 SID2E, DID0x0200, Data0x0320 即 800rpm ECU回6E 02 00 写好了。 三个字节干净利落。 第 4 步验证别偷懒 你发22 02 00 ECU回62 02 00 03 20 当前值确实是 800。 第 5 步保活如果你还要写别的 你发3E 00 ECU回7E 00 第 6 步搞定切回默认会话 你发10 01 ECU回50 01你就这我就这。2E 本身就这么简单。复杂的是前面查规范、确认权限、搞清楚数据格式。NRC 速查ECU 拒绝你的真正原因别望文生义。每个 NRC 都有标准定义别自己猜。NRC它真正的意思你大概干了什么怎么办0x13incorrectMessageLengthOrInvalidFormat数据长度跟 DID 定义不匹配多塞了零或少了字节查规范核对 DataRecord 长度0x22conditionsNotCorrect前提条件不满足比如发动机在转不让你改标定满足条件再来0x31requestOutOfRangeDID 不存在、值超范围、或者这个 DID 是只读的查规范确认 DID 可写、值合法0x33securityAccessDenied没做安全验证或安全等级不够先做 27 服务0x7FserviceNotSupportedInActiveSession当前会话不允许 2E切会话10 02或10 030x78requestCorrectlyReceived-ResponsePending收到在处理等一下别重发。等最终响应0x11serviceNotSupported这个 ECU 压根不支持 2E极罕见查规范最容易搞混的两对0x13 vs 0x31长度/格式错用 0x13值超范围/DID 不存在用 0x31。不是反过来的。0x22 vs 0x7F条件不满足如发动机在转用 0x22会话不对用 0x7F。不是反过来的。0x78 不是资源不可用是稍等我在处理。千万别重发会打乱 ECU 的处理队列。DID 的事儿别把 OEM 的活当成标准的活标准ISO 14229-1只定义了极少数DIDDID含义备注0xF190VIN17 字节 ASCII通常只写一次0xF186Active Diagnostic Session当前会话编号0xF187Part NumberECU 零件号0xF188Software Version软件版本0xF189Hardware Version硬件版本除此之外全是 OEM 自定义。你看到的 0x0200怠速、0x0201水温阈值、0xF200配置码——全是某个 OEM 自己编的。换一个品牌、换一个 ECU 供应商DID 编号可能完全不同。所以永远不要记 DID 编号要查诊断规范。写入之后数据去哪儿了这是很多人忽略的问题。2E 肯定响应只说明ECU 收到了你的数据但不告诉你数据存在哪、什么时候生效。实际上有三种情况由 OEM 定义情况表现你该怎么做立即生效掉电保持写入后马上生效重启还在最理想写个 22 验证一下就行立即生效掉电不保持写入后生效但重启后恢复原值数据在 RAM 里。可能需要额外的存储到 NVM操作OEM 自定义可能是 2E 写一个特殊 DID也可能是 31 跑一个例程写入后不生效需复位写入成功但行为没变发11 01硬复位或11 02软复位重启后生效怎么知道是哪种查诊断规范。标准不管这事儿。传输层CAN 和以太网对 2E 有影响吗应用层格式零影响。2E 02 00 03 20在 CAN 上是这 5 个字节在 DoIP 上还是这 5 个字节。响应6E 02 00在哪儿都是 3 个字节。传输层差异只影响怎么把这 5 个字节送过去CANISO 15765-2DoIPISO 13400短报文≤7 字节有效数据单帧搞定TCP 一个报文搞定长报文如写 17 字节 VIN首帧 连续帧多帧传输TCP 自动分段应用层无感加密无CAN 本身不加密可选 TLS不存在以太网下 2E 格式不同、以太网支持批量写入、以太网支持 4 字节校验这些说法。标准编号别搞混标准号内容ISO 14229-1应用层2E 服务定义在这ISO 14229-2会话层ISO 14229-3UDS on CANISO 14229-5UDS on IPISO 13400DoIPISO 15765-2CAN 传输层多帧最后一张纸的 2E 速查卡打印出来贴工位上。┌─────────────────────────────────────────────────┐ │ 2E 服务速查 │ │ │ │ 请求2E DID_H DID_L Data... │ │ 响应6E DID_H DID_L │ │ 否定7F 2E NRC │ │ │ │ ✓ 没有校验位 │ │ ✓ 没有保留字节 │ │ ✓ 响应不回传数据 │ │ ✓ 一次只写一个 DID │ │ ✓ CAN 和以太网格式完全一样 │ │ │ │ 会话0x02编程 0x03扩展 别搞反 │ │ │ │ 流程查规范 → 切会话 → 安全验证 → 写 → 读回验证│ │ │ │ 常用 NRC │ │ 0x13 长度不对 0x31 值超范围 │ │ 0x22 条件不满足 0x7F 会话不对 │ │ 0x33 没解锁 0x78 等一下别重发 │ └─────────────────────────────────────────────────┘写在最后2E 服务是 UDS 里最所见即所得的服务——请求就是SID DID 数据响应就是0x6E DID没有子功能没有控制模式没有掩码没有花活。它之所以被写错不是因为标准复杂而是因为太简单了简单到很多人不信它就这么多非得给它加点校验位、保留字节、批量写入才觉得完整。别加了。标准就这么多。够用了。如果你在实际项目中被7F 2E 13折磨过或者发现你的诊断规范里某个 DID 的写入行为跟预期不一样——评论区聊。我好奇你的 ECU 是怎么折磨你的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价