UDS 诊断服务系列文章目录
诊断和通信管理功能单元
UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务
UDS 诊断 - ECUReset(ECU重置)(0x11)服务
UDS 诊断 - SecurityAccess(安全访问)(0x27)服务
UDS 诊断 - CommunicationControl(通信控制)(0x28)服务
UDS 诊断 - TesterPresent(测试仪保活)(0x3E)服务
UDS 诊断 - AccessTimingParameter(访问计时参数)(0x83)服务
UDS 诊断 - SecuredDataTransmission(受保护的数据传输)(0x84)服务
UDS 诊断 - ControlDTCSetting(控制DTC设置)(0x85)服务
UDS 诊断 - ResponseOnEvent(基于事件响应)(0x86)服务
UDS 诊断 - LinkControl(链路控制)(0x87)服务
数据传输功能单元
UDS 诊断 - ReadDataByIdentifier(按标识符读取数据)(0x22)服务
UDS 诊断 - ReadMemoryByAddress(按地址读取内存)(0x23)服务
文章目录
- UDS 诊断服务系列文章目录
- 一、服务说明
- 二、请求消息
- 1.请求消息定义
- 2. 请求消息数据参数定义
- 2.1 addressAndLengthFormatIdentifier(地址和长度格式标识符)示例值
- 三、肯定响应消息
- 1. 肯定响应消息定义
- 2. 肯定响应消息数据参数定义
- 四、支持的NRC
- 五、示例
- 1. 假设
- 2. 示例 1:4 字节(32 位)寻址
- 3. 示例 2:2 字节(16 位)寻址
- 4. 示例 3:3 字节(24 位)寻址
一、服务说明
0x23 服务允许客户端通过待读取内存的给定起始地址和大小请求服务器中的内存数据。
ReadMemoryByAddress(按地址读取内存)的请求消息用于向服务器请求通过参数 memoryAddress(内存地址)和 memorySize(内存大小)所识别的内存数据。memoryAddress(内存地址)和memorySize(内存大小)参数所用的字节数由 addressAndLengthFormatIdentifier(地址和长度格式标识符)(高效半字节和低效半字节)确定。
也可使用固定的 addressAndLengthFormatIdentifier(地址和长度格式标识符),并且,memoryAddress(内存地址)和 memorySize(内存大小)参数中未使用的字节在更高范围的地址位置填充有数值 0x00。
在重叠内存区内,可使用附加 memoryAddress(内存地址)字节作为内存标识符(例如,内部和外部闪存的使用)。
服务器通过 ReadMemoryByAddress(按地址读取内存)的肯定响应消息读取数据记录值。dataRecord(数据记录)参数的格式和定义应由车辆制造商规定。dataRecord(数据记录)可包含模拟输入和输出信号、数字输入和输出信号、内部数据,以及系统状态信息(若服务器支持)。
二、请求消息
1.请求消息定义
字节 | 参数名称 | 字节值 | Cvt |
---|---|---|---|
#1 | ReadMemoryByAddress(按地址读取内存)请求SID | 0x23 | M |
#2 | addressAndLengthFormatIdentifier(地址和长度格式标识符) | 0x00 - 0xFF | M |
#3 . . #(m-1)+3 | memoryAddress[] = [ byte #1(MSB) . . byte #m] | 0x00 - 0xFF . . 0x00 - 0xFF | M . . C1 |
#n-(k-1) . . #n | memorySize[] = [ byte #1(MSB) . . byte #k] | 0x00 - 0xFF . . 0x00 - 0xFF | M . . C2 |
C1:此参数的存在性取决于 addressAndLengthFormatIdentifier(地址和长度格式标识符)的地址长度信息参数。
C2:此参数的存在性取决于 addressAndLengthFormatIdentifier(地址和长度格式标识符)的内存大小长度信息。
2. 请求消息数据参数定义
定义 |
---|
addressAndLengthFormatIdentifier(地址和长度格式标识符) 此参数为单字节值,每个半字节采用单独的编码:第 7 位至第 4 位:memorySize(内存大小)参数的长度(字节数),第 3 - 0 位:memoryAddress(内存地址)参数的长度(字节数)。 |
memoryAddress(内存地址) 此参数是服务器内存的起始地址,从该地址检索数据。该地址所用的字节数由 addressAndLengthFormatIdentifier(地址和长度格式标识符)的低效半字节(第 3 位至第 0 位)确定。memoryAddress(内存地址)参数的第 m 个字节始终为服务器中当前所引用的地址的最低有效字节。地址的最高有效字节可以用作内存标识符。 内存标识符的使用示例可为一个带 16 位寻址和内存地址重叠的双处理器服务器(给定地址适用于处理器但得出不同的物理内存设备或使用内部和外部闪存的情况下)。在该情况下,可以将 memoryAddress(内存地址)参数中另外未使用的字节指定为用于选择期望内存设备的内存标识符。此功能的使用应由车辆制造商 / 系统供应商确定。 |
**memorySize(内存大小)** <br>此参数指定了从服务器内存中 memoryAddress 所指定的地址开始的待读取字节数。该内存大小所用的字节数由 addressAndLengthFormatIdentifier(地址和长度格式标识符)的高效半字节(第 7 位至第 4 位)确定。|
2.1 addressAndLengthFormatIdentifier(地址和长度格式标识符)示例值
下表中包含 addressAndLengthFormatIdentifier(地址和长度格式标识符)值组合的示例。需要考虑以下情况:
- 不得使用或必须由服务器通过否定消息拒绝将 “manageable memorySize(可管理的内存大小)” 或 “memoryAddress range(内存地址范围)” 标记为 “not applicable(不适用)” 的值。
- 对于带有适用 “manageable memorySize(可管理的内存大小)” 或 “memoryAddress range(内存地址范围)” 的值,允许该参数使用。
字节值 | 说明 | |||
---|---|---|---|---|
memorySize(内存大小)字节的 7 - 4 位(高效半字节)编号 | memoryAddress(内存地址)字节的 3 - 0 位(低效半字节)编号 | |||
memorySize(内存大小)参数所用的字节 | 可管理的大小 | memoryAddress(内存地址)参数所用的字节 | 可寻址内存 | |
0x00 | 不适用 | 不适用 | 不适用 | 不适用 |
0x01 | 不适用 | 不适用 | 1 | 256 个字节 - 1 |
0x02 | 不适用 | 不适用 | 2 | 64KB - 1 |
0x03 | 不适用 | 不适用 | 3 | 16MB - 1 |
0x04 | 不适用 | 不适用 | 4 | 4GB - 1 |
0x05 | 不适用 | 不适用 | 5 | 1024GB - 1 |
0x06 - 0x0F | .. | .. | .. | .. |
0x10 | 1 | 256个字节 | 不适用 | 不适用 |
0x11 | 1 | 256个字节 | 2 | 256 个字节 - 1 |
0x12 | 1 | 256个字节 | 3 | 64KB - 1 |
0x13 | 1 | 256个字节 | 4 | 16MB - 1 |
0x14 | 1 | 256个字节 | 5 | 4GB - 1 |
0x15 | 1 | 256个字节 | 1 | 1024GB - 1 |
0x16 - 0x1F | .. | .. | .. | .. |
0x20 | 2 | 64KB | 不适用 | 不适用 |
0x21 | 2 | 64KB | 1 | 256 个字节 - 1 |
0x22 | 2 | 64KB | 2 | 64KB - 1 |
0x23 | 2 | 64KB | 3 | 16MB - 1 |
0x24 | 2 | 64KB | 4 | 4GB - 1 |
0x25 | 2 | 64KB | 5 | 1024GB - 1 |
0x26 - 0x2F | .. | .. | .. | .. |
0x30 | 3 | 16MB | 不适用 | 不适用 |
0x31 | 3 | 16MB | 1 | 256 个字节 - 1 |
0x32 | 3 | 16MB | 2 | 64KB - 1 |
0x33 | 3 | 16MB | 3 | 16MB - 1 |
0x34 | 3 | 16MB | 4 | 4GB - 1 |
0x35 | 3 | 16MB | 5 | 1024GB - 1 |
0x36 - 0x3F | .. | .. | .. | .. |
0x40 | 4 | 4GB | 不适用 | 不适用 |
0x41 | 4 | 4GB | 1 | 256 个字节 - 1 |
0x42 | 4 | 4GB | 2 | 64KB - 1 |
0x43 | 4 | 14GB | 3 | 16MB - 1 |
0x44 | 4 | 4GB | 4 | 4GB - 1 |
0x45 | 4 | 4GB | 5 | 1024GB - 1 |
0x46 - 0xFF | .. | .. | .. | .. |
三、肯定响应消息
1. 肯定响应消息定义
字节 | 参数名称 | 字节值 |
---|---|---|
#1 | ReadMemoryByAddress(按地址读取内存)响应SID | 0x63 |
#2 . . #n | dataRecord[] = [ data #1 . . data #m] | 0x00 - 0xFF . . 0x00 - 0xFF |
2. 肯定响应消息数据参数定义
定义 |
---|
dataRecord(数据记录) 此参数用在 0x23 服务的肯定响应消息中,用以向客户端提供所请求的数据记录值。 |
四、支持的NRC
NRC | 说明 |
---|---|
0x13 | 消息长度不正确或格式无效 |
0x22 | 条件不正确 若不满足服务器的运行条件而无法执行所需的操作,则应发送此 NRC。 |
0x31 | 请求超过限值 以下情况下,应发送此 NRC: - 间隔 [0xMA, (0xMA + 0xMS -0x1)] 内的内存地址无效; - 间隔 [0xMA, (0xMA + 0xMS -0x1)] 内的内存地址受限; 服务器不支持请求消息中的 memorySize(内存大小)参数值; 指定的 addressAndLengthFormatIdentifier(地址和长度格式标识符)无效; 请求消息中的 memorySize 参数值为 0; |
0x33 | 安全访问被拒绝 若间隔 [0xMA, (0xMA + 0xMS -0x1)] 内的内存地址已受保护并且服务器已锁止,则应发送此 NRC。 |
下图为 0x23 服务的否定响应码的处理。
图例
1. 至少 4 个(SI + addressAndLengthFormatIdentifier(地址和长度格式标识符)+ 最小 memoryAddress + 最小 memorySize)
2. 单字节 SI + 单字节 addressAndLengthFormatIdentifier(地址和长度格式标识符)+ n 个字节 memoryAddress 参数长度 + n 个字节 memorySize 参数长度
五、示例
1. 假设
本条规定了为执行 0x23 服务示例需满足的条件。本示例中的服务不受服务器任何限制条件的限制。
2. 示例 1:4 字节(32 位)寻址
客户端从内存地址 0x2048 1392
开始读取服务器内存中的 259 数据字节
。
req 23 24 20 48 13 92 01 03
resp 63 00 ... 8C
req #2:addressAndLengthFormatIdentifier(地址和长度格式标识符),其中 memoryAddress 字节长度 = 4;memorySize 字节长度 = 2;
req #3-#6:memoryAddress:0x20481392
req #7-#8:memoryAddress:0x0103
resp #2-#259+1:dataRecord[ 第 1 个数据 ] (第 1 个存储单元)- dataRecord[ 第 259 个数据 ](第 259 个存储单元)
3. 示例 2:2 字节(16 位)寻址
客户端从内存地址 0x4813
开始读取服务器内存中的 5 个数据字节
。
req 23 12 48 13 05
resp 63 43 2A 07 2A 55
req #2:addressAndLengthFormatIdentifier(地址和长度格式标识符),其中 memoryAddress 字节长度 = 2;memorySize 字节长度 = 1;
req #3-#4:memoryAddress:0x4813
req #5:memoryAddress:0x05
resp #2-#6:dataRecord[ 第 1 个数据 ] (第 1 个存储单元)- dataRecord[ 第 5 个数据 ](第 5 个存储单元)
4. 示例 3:3 字节(24 位)寻址
客户端从内存地址 0x204813
开始读取服务器外部 RAM 单元
中的 3 个数据字节
。
req 23 23 20 48 13 00 03
resp 63 00 01 8C
req #2:addressAndLengthFormatIdentifier(地址和长度格式标识符),其中 memoryAddress 字节长度 = 3;memorySize 字节长度 = 3;
req #3-#4:memoryAddress:0x204813
req #5:memoryAddress:0x0003
resp #2-#4:dataRecord[ 第 1 个数据 ] (第 1 个存储单元)- dataRecord[ 第 3 个数据 ](第 3 个存储单元)