AUTOSAR 诊断服务0x22 (Read Data By Identifier) DID配置指南
文档信息
- AUTOSAR版本: Classic Platform 4.2.2
- 适用模块: DCM (Diagnostic Communication Manager)
目录
概述
什么是诊断服务0x22?
UDS(Unified Diagnostic Services)诊断服务0x22用于通过标识符读取数据(Read Data By Identifier)。诊断仪通过发送DID(Data Identifier)来请求ECU返回对应的数据。
服务格式
请求格式:
22 [DID_High] [DID_Low]
响应格式:
62 [DID_High] [DID_Low] [Data...]
示例:
- 请求:
22 F1 86(读取DID 0xF186) - 响应:
62 F1 86 5A(DID 0xF186的值为0x5A)
DID配置结构
AUTOSAR中DID配置采用层次化结构:
DcmDspDid (DID容器)
├── DcmDspDidId: 0xF186
├── DcmDspDidInfoRef → DcmDspDidInfo
│ ├── DcmDspDidRead (读权限配置)
│ │ ├── 安全级别要求
│ │ └── 会话要求
│ ├── DcmDspDidWrite (写权限配置)
│ └── DcmDspDidControl (控制权限配置)
└── DcmDspDidSignal → DcmDspData
├── DcmDspDataType: UINT8
├── DcmDspDataSize: 8 bits
├── DcmDspDataUsePort: 数据访问方式
├── DcmDspDataReadFnc: 读取回调函数
├── DcmDspDataEndianness: 字节序
└── 其他配置项...
配置项详解
1. DcmDspDataUsePort
含义: 定义数据访问方式
数据类型: Dcm_DspDataUsePortEnumType
可选值:
| 值 | 宏定义 | 说明 | 使用场景 |
|---|---|---|---|
| 0 | USE_BLOCK_ID |
使用NvM块ID | 数据存储在非易失性内存 |
| 1 | USE_DATA_ASYNCH_CLIENT_SERVER |
异步C/S接口 | 需要异步处理的复杂数据 |
| 2 | USE_DATA_ASYNCH_CLIENT_SERVER_ERROR |
异步C/S接口(带错误) | 异步处理+错误处理 |
| 3 | USE_DATA_ASYNCH_FNC |
异步函数调用 | 异步数据处理 |
| 4 | USE_DATA_ASYNCH_FNC_ERROR |
异步函数(带错误) | 异步处理+错误处理 |
| 5 | USE_DATA_SENDER_RECEIVER |
发送者-接收者接口 | RTE通信 |
| 6 | USE_DATA_SENDER_RECEIVER_AS_SERVICE |
S/R服务接口 | RTE服务通信 |
| 7 | USE_DATA_SYNCH_CLIENT_SERVER |
同步C/S接口 | RTE同步接口 |
| 8 | USE_DATA_SYNCH_FNC |
同步函数调用 | 最常用,简单直接 |
| 9 | USE_ECU_SIGNAL |
ECU信号方式 | 信号级访问 |
推荐选择:
- 简单DID →
USE_DATA_SYNCH_FNC - NvM存储数据 →
USE_BLOCK_ID - RTE集成 →
USE_DATA_SYNCH_CLIENT_SERVER
2. DcmDspDataType
含义: 数据元素的类型
数据类型: Dcm_DspDataEnumType
可选值:
| 值 | 类型 | 大小 | 范围 | 说明 |
|---|---|---|---|---|
| 0 | DCM_BOOLEAN |
1 bit | 0/1 | 布尔类型 |
| 5 | DCM_SINT8 |
8 bits | -128 ~ +127 | 有符号8位 |
| 6 | DCM_SINT8_N |
8 bits | -128 ~ +127 | 有符号8位(数组) |
| 7 | DCM_UINT16 |
16 bits | 0 ~ 65535 | 无符号16位 |
| 8 | DCM_UINT16_N |
16 bits | 0 ~ 65535 | 无符号16位(数组) |
| 9 | DCM_UINT32 |
32 bits | 0 ~ 4294967295 | 无符号32位 |
| 10 | DCM_UINT32_N |
32 bits | 0 ~ 4294967295 | 无符号32位(数组) |
| 11 | DCM_UINT8 |
8 bits | 0 ~ 255 | 无符号8位 |
| 12 | DCM_UINT8_DYN |
动态 | - | 动态长度数组 |
| 13 | DCM_UINT8_N |
8 bits | 0 ~ 255 | 无符号8位(数组) |
| 14 | DCM_VARIABLE_LENGTH |
动态 | - | 可变长度 |
类型选择指南:
- 单个数值 →
DCM_UINT8/UINT16/UINT32 - 固定长度数组 →
DCM_UINT8_N/UINT16_N/UINT32_N - 动态长度数组 →
DCM_UINT8_DYN
3. DcmDspDataSize
含义: 数据大小(以位为单位)
数据类型: uint16
计算公式:
字节数 = (DcmDspDataSize + 7) / 8
常用值:
8→ 1字节16→ 2字节32→ 4字节64→ 8字节
注意事项:
- 仅用于固定长度DID
- 动态长度DID(
DCM_UINT8_DYN)必须配置DcmDspDataReadDataLengthFnc
4. DcmDspDataEndianness
含义: 多字节数据的字节序
数据类型: Dcm_DspEndianType
可选值:
| 值 | 宏定义 | 说明 | 示例(0x1234) |
|---|---|---|---|
| 0 | DCM_BIG_ENDIAN |
大端序(网络字节序) | 0x12 0x34 |
| 1 | DCM_LITTLE_ENDIAN |
小端序(主机字节序) | 0x34 0x12 |
| 2 | DCM_OPAQUE |
不透明(无转换) | 原始字节流 |
选择建议:
- 单字节数据(UINT8)→
DCM_OPAQUE - 多字节数据 → 根据网络协议要求选择
- 网络传输通常使用 →
DCM_BIG_ENDIAN
5. DcmDspDataReadFnc ⭐
含义: 数据读取回调函数(最重要的配置项)
数据类型: Dcm_ReadDataFncType
函数原型:
typedef Std_ReturnType (*Dcm_ReadDataFncType)(
Dcm_OpStatusType OpStatus, // 操作状态
uint8* Data, // 输出数据缓冲区
Dcm_NegativeResponseCodeType* ErrorCode // 错误码
);
参数说明:
OpStatus:DCM_INITIAL: 首次调用DCM_PENDING: 挂起状态(异步操作)DCM_CANCEL: 取消操作
Data: 输出缓冲区,函数需将读取的数据写入此缓冲区ErrorCode: 错误时返回NRC(Negative Response Code)
返回值:
E_OK: 成功E_NOT_OK: 失败(需设置ErrorCode)DCM_E_PENDING: 挂起(异步操作未完成)
实现示例:
Std_ReturnType App_ReadDID_VehicleSpeed(
Dcm_OpStatusType OpStatus,
uint8* Data,
Dcm_NegativeResponseCodeType* ErrorCode
)
{
// 检查条件
if (SystemState != SYSTEM_READY)
{
*ErrorCode = DCM_E_CONDITIONSNOTCORRECT; // NRC 0x22
return E_NOT_OK;
}
// 读取数据
uint8 speed = GetVehicleSpeed();
Data[0] = speed;
return E_OK;
}
注意事项:
- 必须为可读DID配置此函数
- NULL_PTR表示不支持读取
- 数据长度必须与
DcmDspDataSize一致
6. DcmDspDataReadDataLengthFnc
含义: 读取数据长度函数(仅用于动态长度DID)
数据类型: Dcm_ReadDataLengthFncType
函数原型:
typedef Std_ReturnType (*Dcm_ReadDataLengthFncType)(
Dcm_OpStatusType OpStatus,
uint16* DidLength // 输出:数据长度
);
使用条件:
if (DcmDspDataType == DCM_UINT8_DYN)
{
// 必须配置 DcmDspDataReadDataLengthFnc
}
else
{
// 固定长度,设置为 NULL_PTR
}
实现示例:
Std_ReturnType App_GetDID_DynamicLength(
Dcm_OpStatusType OpStatus,
uint16* DidLength
)
{
// 返回当前数据的实际长度
*DidLength = GetCurrentDataLength();
return E_OK;
}
7. DcmDspDataConditionCheckReadFnc
含义: 读取前的条件检查函数
数据类型: Dcm_ConditionCheckReadFncType
函数原型:
typedef Std_ReturnType (*Dcm_ConditionCheckReadFncType)(
Dcm_OpStatusType OpStatus,
Dcm_NegativeResponseCodeType* Nrc
);
作用: 在实际读取数据之前检查系统状态
实现示例:
Std_ReturnType App_ConditionCheck_VehicleSpeed(
Dcm_OpStatusType OpStatus,
Dcm_NegativeResponseCodeType* Nrc
)
{
// 检查车辆状态
if (GetVehicleState() != VEHICLE_RUNNING)
{
*Nrc = DCM_E_CONDITIONSNOTCORRECT; // NRC 0x22
return E_NOT_OK;
}
// 检查安全条件
if (!IsSafeToReadSpeed())
{
*Nrc = DCM_E_SECURITYACCESSDENIED; // NRC 0x33
return E_NOT_OK;
}
return E_OK;
}
常用场景:
- 检查车速、档位等条件
- 检查系统状态
- 检查传感器可用性
- 检查安全条件
8. DcmDspDataWriteFnc
含义: 数据写入函数(用于0x2E服务)
数据类型: Dcm_WriteDataFncType

最低0.47元/天 解锁文章
4351

被折叠的 条评论
为什么被折叠?



