《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存


Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快速了解他们。(各服务介绍持续更新中…)

学习UDS基础知识以及其他相关内容?>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<

一、简介

  简单的说,该服务允许Tester通过发送请求提供起始地址和要读取的内存大小从目标ECU中请求内存数据。

  目标ECU将在正响应消息中返回内存中的实际数据。响应消息中的数据参数的格式和定义由车辆制造商具体决定。数据可能包括模拟输入输出信号、数字输入输出信号、内部数据和系统状态信息等,当然,前提是目标ECU支持这些数据的读取。

二、数据包格式

2.1 服务请求格式

  其请求消息里面包含了两个重要的参数:memoryAddress(内存地址)和memorySize(内存大小)。memoryAddress指的是数据开始的地址,而memorySize指的是要读取的数据的字节数。请求消息中还有一个参数叫作addressAndLengthFormatIdentifier,这个参数定义了内存地址和内存大小两个参数各使用多少字节表示。它由一个字节构成,低半字节表示内存地址使用的字节数,高半字节表示内存长度使用的字节数。

在这里插入图片描述

  本服务不支持sub-function,各个参数的详细含义如下所示:

  addressAndLengthFormatIdentifier(1Byte):这个参数是一个字节的值,用来定义接下来两个参数memoryAddress和memorySize的字节长度。它的每半字节都有独立的编码规则:

  • 高半字节(bit 7 - 4):表示memorySize参数的长度(即,读取的字节数的长度用几个字节表示)。
  • 低半字节(bit 3 - 0):表示memoryAddress参数的长度(即,内存地址的长度用几个字节表示)。

  通常情况下,针对特定的ECU,addressAndLengthFormatIdentifier的格式也是固定的。如果在memoryAddressmemorySize中有未使用到的字节,这些字节将一般会在高位用0x00填充。

  memoryAddress(不定长):指定了目标ECU内存中数据读取的起始地址。此地址的具体字节数由addressAndLengthFormatIdentifier的低半字节确定。

Tip📌:地址的高位字节可以用作内存标识符,用于在存在地址重叠的情况下区分不同的内存装置或处理器。
  例如,在一个具有16位地址的双处理器服务器上,如果某个地址对两个处理器都有效,但指向不同的物理内存装置或内部和外部闪存,这时可以使用内存地址参数中的一个未使用字节作为内存标识符来选择期望的内存装置。

  memorySize(不定长):这个参数指定了从memoryAddress开始要读取的字节数。该字节数由addressAndLengthFormatIdentifier的高半字节定义。

2.2 服务响应格式

2.2.1 肯定响应

在这里插入图片描述

  dataRecord(不定长):dataRecord包含的具体内容在UDS协议的文档中并没有定义。其格式由制造商定义,直接反映出Tester7请求读取的那部分内存内容。

Tip📌:尽管UDS协议没有定义dataRecord的具体内容,但数据的格式化方式应由车辆制造商或系统供应商事先定义。这是因为不同的车辆制造商或系统可能会以不同的方式存储和管理数据。

  例如,如果一个诊断工具请求从ECU的特定内存地址开始读取某个传感器的数据,那么ECU返回的dataRecord参数将包含该传感器数据的实际值。这些数据可能是原始的二进制值,也可能是经过一定处理的数值,具体取决于车辆制造商定义的格式。诊断工具需要依据制造商提供的数据格式指南来解析dataRecord中的数据,进而得到有意义的诊断信息。

2.2.2 否定响应

在这里插入图片描述

  可能出现的NRC及其含义如下:

NRC 含义
0x13 消息长度错误
0x22 当前条件不满足
0x31 请求参数不受支持,参数错误
0x33 未通过安全访问

  NRC的处理流程如下所示(即推荐的错误情况检查顺序):

在这里插入图片描述

三、通信示例

  假设目标ECU是32位寻址的,及其flash访问地址支持4个字节的寻址空间(换句话说就是地址占用4个字节),我们希望通过该服务从目标ECU的地址0x20481392处读取259字节的数据,请求及响应过程如下所示:

诊断仪 目标ECU 23 24 20 48 13 92 01 03 1 诊断仪发送请求: 第一个字节为SID, 紧接着四个字节是内存地址, 0x0103是要读取的大小, 转换为十进制就是259字节 63 00 ... ... 8C (除了63总计还有259字节) 2 目标ECU给出正响应: 第一个字节为SID+0x40 剩下的259字节为对应内存位置的数据 诊断仪 目标ECU

  这个服务比较简单,UDS协议中还给出了地址为两字节的和三字节的示例,没什么大的区别,有需要的可以再去协议中找对应例子再看看,这里不再赘述。

>>>>>>>>> 返回专栏总目录 《UDS协议从入门到精通(UDS速查手册)》<<<<<<<<<

相关推荐

  1. 24.Python入门精通—函数 标准模块 包

    2024-06-06 11:42:07       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 11:42:07       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 11:42:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 11:42:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 11:42:07       18 阅读

热门阅读

  1. Yolov10环境配置+训练自己数据集(Windows10)

    2024-06-06 11:42:07       8 阅读
  2. Life perception 4

    2024-06-06 11:42:07       7 阅读
  3. python 编写登录界面

    2024-06-06 11:42:07       7 阅读
  4. pandas不要存储excel

    2024-06-06 11:42:07       8 阅读
  5. 深度学习中域适应的简要概述

    2024-06-06 11:42:07       7 阅读
  6. css实现不同设备适配

    2024-06-06 11:42:07       6 阅读
  7. 前端想学习后端需要下载那些东西

    2024-06-06 11:42:07       7 阅读