文章目录
一、简介
这个服务的目的是确保诊断服务或者之前激活的通信还处在激活的状态,可以保持当前的非默认(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