AUTOSAR_诊断服务0x22_DID配置指南

AUTOSAR 诊断服务0x22 (Read Data By Identifier) DID配置指南

文档信息

  • AUTOSAR版本: Classic Platform 4.2.2
  • 适用模块: DCM (Diagnostic Communication Manager)

目录

  1. 概述
  2. DID配置结构
  3. 配置项详解
  4. 数据类型说明
  5. 数据访问方式
  6. 完整配置示例
  7. 常见应用场景
  8. 常见问题与解决方案

概述

什么是诊断服务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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一万个W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值