当前位置: 首页 > news >正文

UDS协议中0x31服务(Routine Control)详解及应用

UDS 协议中 0x31 服务(Routine Control)详解及应用

一、0x31 服务概述

作用:0x31 服务(Routine Control,例程控制)用于在 ECU 上执行特定的诊断例程,包括但不限于内存擦除、传感器校准、系统测试等操作,是实现 ECU 深度诊断和维护功能的重要手段。

使用场景:通常在 ECU 处于编程会话(0x02)或扩展诊断会话(0x03),且已通过安全访问(0x27)解锁对应权限后执行。例如,在固件升级前需用此服务擦除目标内存区域,或在维修时对传感器进行校准操作。

二、请求报文格式(Tester → ECU)

参数 字节长度 含义 示例值
SID 1 Byte 服务标识符,固定为 0x31 0x31
Sub-Function 1 Byte 子功能代码,定义具体执行的例程类型,如 0x01(启动例程)、0x02(停止例程)、0x03(请求例程结果) 0x01
RoutineIdentifier 2 Bytes 例程序号,唯一标识需执行的例程(不同 ECU 对例程编号定义不同,需参考具体车型文档) 0x0010
ParameterRecord 可变长度 传递给例程的参数(如擦除地址范围、校准系数等),长度由例程需求决定 0x08000000 0x00010000(擦除地址 0x08000000,长度 64KB)

示例报文

31 01 00 10 08 00 00 00 00 01 00 00

含义:在编程会话中,请求启动编号为 0x0010 的例程,目标是擦除从地址 0x08000000 开始、长度为 64KB 的内存区域。

三、响应报文格式(ECU → Tester)

1. 肯定响应(0x71)

参数 字节长度 含义 示例值
SID+0x40 1 Byte 响应标识符,固定为 0x71(0x31 + 0x40) 0x71
Sub-Function 1 Byte 确认执行的子功能代码,与请求报文中的子功能一致 0x01
RoutineIdentifier 2 Bytes 确认执行的例程序号 0x0010
RoutineResult 可变长度 例程执行结果数据(如校准后参数、擦除状态标志),长度由例程定义 0x00(擦除成功)

示例响应

71 01 00 10 00

含义:ECU 确认已成功启动编号为 0x0010 的例程,内存擦除操作执行成功。

2. 否定响应(0x7F)

常见否定响应码(NRC):

  • 0x12:子功能不支持(如请求的子功能或例程在当前 ECU 中不存在);

  • 0x22:条件不满足(如未处于正确的诊断会话,或未通过安全访问);

  • 0x31:参数无效(传入的参数超出例程允许范围,如错误的内存地址);

  • 0x33:安全访问未解锁(执行敏感例程前未完成权限验证);

  • 0x72:故障处于活动状态(执行例程时检测到其他故障,导致操作中断)。

四、通信流程与关键机制

例程执行流程

  1. 启动例程(Sub-Function 0x01):诊断设备发送包含例程序号和参数的请求,ECU 验证权限和参数后执行例程,并返回肯定响应;

  2. 停止例程(Sub-Function 0x02):在例程运行过程中,诊断设备可随时发送停止请求,强制中断例程;

  3. 请求结果(Sub-Function 0x03):例程执行完成或停止后,诊断设备通过此子功能获取执行结果数据(如校验值、状态标志)。

安全与权限控制

  • 敏感例程(如内存擦除、ECU 复位)必须在高安全等级(如 Level 3)解锁后执行;

  • ECU 通过 NRC 返回错误码,拒绝未授权或参数错误的请求。

超时与重试机制

  • 诊断设备需设置合理的超时时间(如 P2Timeout),避免因网络延迟导致例程执行失败;

  • 若请求超时或收到否定响应,可根据 NRC 判断原因后重新发起请求。

五、实际应用案例

场景:ECU 固件升级前的内存擦除

  1. 请求启动擦除例程
    报文:

    报文:31 01 00 01 08 00 00 00 00 01 00 00

    含义:启动编号为 0x0001 的擦除例程,擦除地址 0x08000000 开始的 64KB 区域;

  2. ECU 响应
    肯定响应:

    肯定响应:71 01 00 01 00(擦除成功);

  3. 确认结果
    发送子功能 0x03 请求:

    发送子功能 0x03 请求:31 03 00 01,ECU 返回详细擦除状态数据,验证内存是否已清空。

场景:传感器校准

  1. 请求启动校准例程
    报文:

    报文:31 01 00 05 01 02(假设 0x0005 为例程号,0x01 02 为校准参数);

  2. ECU 执行校准
    完成后返回肯定响应,并包含校准后参数;

    完成后返回肯定响应,并包含校准后参数;

  3. 保存校准结果
    诊断设备通过其他服务(如 2E 服务)将新参数写入 ECU 非易失性存储。

    诊断设备通过其他服务(如 2E 服务)将新参数写入 ECU 非易失性存储。

六、配置注意事项

例程定义与兼容性

  • 不同车型或 ECU 对例程序号(RoutineIdentifier)和参数格式的定义差异大,需严格参照 OEM 文档;

  • 确保诊断设备支持目标 ECU 的所有例程子功能。

安全与权限管理

  • 执行敏感例程前,必须通过 0x27 服务完成对应安全等级的解锁;

  • 建议在执行例程前后检查 ECU 故障状态,避免因潜在故障导致操作失败。

数据一致性校验

  • 部分例程(如擦除、写入)需配合其他服务(如 34、36、37 服务)使用,确保数据完整性;

  • 对例程执行结果进行校验(如对比预期值与返回结果),防止错误操作。

这份内容全面解析了 0x31 服务。若你还想补充服务对比、增加更多案例,或是调整表述风格,欢迎随时告诉我。

相关文章:

  • 网络安全防护:点击劫持
  • uniapp中vue3 ,uview-plus使用!
  • 【SystemVerilog 2023 Std】第5章 词法约定 Lexical conventions (2)
  • 3款工具打造递进图:快速入门与个性化定制的实用指南
  • 【DNS解析】DNS解析从入门到精通
  • 音视频的前端知识
  • Git更新master分支完整指南:从拉取到推送的全流程
  • ArcGIS Pro 3.4 二次开发 - 工作流
  • Rust 学习笔记1
  • Mysql 函数concat、concat_ws和group_concat
  • 深入解析 MySQL 架构:从基础到高级
  • c++ std::function
  • 语法疫苗:SynCode如何为LLM生成装上“防崩溃引擎”
  • leetcode-hot-100 (链表)
  • 如何使用Postman做接口自动化测试
  • 某靶场CTF题目:利用Apache APISIX默认Token漏洞(CVE-2020-13945)获取Flag
  • lua读取请求体
  • 保姆级安装OpenResty教程
  • 开发指南121-微服务的弹性伸缩
  • opencv 之 视频类 VideoCapture、VideoWriter详细介绍
  • tk网站免费/网站流量排名查询工具
  • 网站开发项目需求分析/泉州seo报价
  • 湖南营销型网站建设报价/全球疫情最新数据消息
  • 茶山东莞网站建设/深圳市网络seo推广平台
  • 商城小程序方案/seo网站推广主要目的不包括
  • 收购域名/长沙关键词优化平台