[AUTOSAR][诊断管理][ECU][$3E] 测试设备在线|会话保持

该博客详细介绍了AUTOSAR ECU中的3E服务,其目的用于保持非默认诊断会话的激活状态,防止自动切换回默认会话。内容包括服务请求报文定义、肯定响应、不支持的NRC以及示例步骤,展示了当supportPosRspMsgIndicationBit分别为0和1时的不同响应。示例代码展示了如何在实践中应用3E服务以维持特定会话。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态,可以保持当前的非默认(Default Session)会话,通过周期地发送请求帧来阻止自动跳转回默认(Default Session)会话。

二、服务请求报文定义

在这里插入图片描述
Sub-Function定义:
在这里插入图片描述
注意上图为Bit 6 ~ 0的定义,Bit 7(supportPosRspMsgIndicationBit)未在这里定义。

本服务不支持有数据参数的报文。

三、肯定响应

在这里插入图片描述

四、支持的NRC

在这里插入图片描述

四、示例步骤

在举例之前先来了解下supportPosRspMsgIndicationBit,在ISO14229-1:2013(E)文档中定义如下:
在这里插入图片描述

  • supportPosRspMsgIndicationBit = FALSE时:不禁止肯定响应报文的发送
  • supportPosRspMsgIndicationBit = TRUE时:禁止发送肯定响应的报文

(1)supportPosRspMsgIndicationBit=0

发送请求:3E 00

肯定响应:7E 00

(2)supportPosRspMsgIndicationBit=1

发送请求:3E 80

肯定响应:无肯定响应报文回复

一般在实际应用中,比如在写DID的时候,可能会要求进入用户自定义的Session,还有可能会通过0x27服务进入一定安全等级,为了使这些服务在写DID的时候是在激活状态,就会使用0x3E使这些服务保持在激活状态,以完成写DID的操作。

三、示例代码

3e_test_present.c

/********************************************************************************
* @file    3e_test_present.c
* @author  jianqiang.xue
* @version V1.0.0
* @date    2023-05-30
* @brief   测试设备在线
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include "modules.h"
#include "os_api.h"
#include "edebug.h"
#include "kv_sys.h"
/* Private includes ----------------------------------------------------------*/
#include "std_math.h"
#include "app_can.h"
#include "can_nm.h"
#include "app_nm.h"
#include "diag_main.h"
/* Private define ------------------------------------------------------------*/
#define UDS_ID    0x3e

/* Private typedef -----------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/***************软定时器创建***************/
/* Private func --------------------------------------------------------------*/
void uds3e_main(nwl_msg_t* p) {
    if (p->len != 0x02) {
        send_nrc_data(UDS_ID, NRC_INCORRECT_MESSAGE_LENTH);
        goto end;
    }
    switch (p->data[1] & 0x7F) {
        case 0:
            if (p->data[1] & 0x80) {
                // 应用无需应答
            } else {
                uint8_t data[8];
                // 回复正响应码  单帧格式: len, 服务ID|0x40, 子功能ID,
                data[0] = 2;  // 数据总长度=数据长度+服务号
                data[1] = UDS_ID | 0x40;   // 服务号,回复上位机需要 |0x40
                data[2] = p->data[1];
                memset(&data[3], 0xAA, 5);
                app_can_enqueue_msg(CAN_MSG_EVENT_SEND, NWL_RES_ADDR, data, 8);
            }
            g_p2_service_time_remaining = 0; // 如果发送诊断报文,则清除倒计时。P2_SERVER_MAX
            break;
        default:
            send_nrc_data(UDS_ID, NRC_SUBFUNCTION_NOT_SUPPORTED);
            break;
    }
end:
    return;
}

#if AUTOSAR_DIAG_SWITCH && USE_UDS_3E
DIAG_SERVICE_REG(UDS_ID, DIAG_NO_SECURITY_LEVEL, (DEFAULT_SESSION|PROGRAMMING_SESSION|EXTENDED_SESSION),
                 (DIAG_PHYS_REQ|DIAG_FUNC_REQ), NULL, NULL, uds3e_main);
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jianqiang.xue

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

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

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

打赏作者

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

抵扣说明:

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

余额充值