From df041e46eb9e760f9f28f88e2ac1044c0d528fbb Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 21 Apr 2026 15:09:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanUds.c | 24 +++++++++++++++++++----- CanUds.h | 5 +++-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/CanUds.c b/CanUds.c index bbbe97e..bc3a944 100644 --- a/CanUds.c +++ b/CanUds.c @@ -300,7 +300,7 @@ static uint16_t DiagnosticSessionControl_10(tCanUds *env) { // Нормальный таймаут. Важно: Клиент может отправлять TesterPresent для поддержания сессии // 50 мс - diagnosticSessionsType->P2 = 50; + diagnosticSessionsType->P2 = 500; // Расширенный таймаут. Например, ECU может обрабатывать сложный запрос 2 секунды и отправлять NRC 0x78, затем ответ // 5000 мс @@ -777,7 +777,8 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { } if ((com->sub_function != UDS_dtc_reportNumberOfDTCByStatusMask) && - (com->sub_function != UDS_dtc_reportDTCByStatusMask)) { + (com->sub_function != UDS_dtc_reportDTCByStatusMask) && + (com->sub_function != UDS_dtc_reportDTCBySupport)) { return setResponseError(env, UDS_ReadDTCInformation, UDS_error_sub_functionNotSupported); } @@ -794,9 +795,9 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { env->dataResponse[1] = env->data->data[1] & 0b01111111; // sub-function // доступные биты статусов - env->dataResponse[2] = 0xFF; + env->dataResponse[2] = 0x09; // формат кодирования DTC - env->dataResponse[3] = 1; + env->dataResponse[3] = 0; // старший байт количества DTC env->dataResponse[4] = 0; @@ -813,7 +814,7 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { env->dataResponse[1] = env->data->data[1] & 0b01111111; // sub-function // доступные биты статусов - env->dataResponse[2] = 0xFF; + env->dataResponse[2] = 0x09; response_size = 3; @@ -821,6 +822,19 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { response_size += SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ReadDTCInformation_19_2, &diagnosticDTC); } + if (com->sub_function == UDS_dtc_reportDTCBySupport) { + + env->dataResponse[1] = env->data->data[1] & 0b01111111; // sub-function + + // доступные биты статусов + env->dataResponse[2] = 0x09; + + response_size = 3; + + tDiagnosticDTC diagnosticDTC = {env->data->data[2], &env->dataResponse[response_size]}; + response_size += SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ReadDTCInformation_19_A, &diagnosticDTC); + } + return response_size; } // конец --------------------------- Чтение ошибок --------------------------------------------------------- diff --git a/CanUds.h b/CanUds.h index 73710de..5832598 100644 --- a/CanUds.h +++ b/CanUds.h @@ -81,8 +81,9 @@ typedef enum { } eUdsIO; typedef enum { - UDS_dtc_reportNumberOfDTCByStatusMask = 0x1, - UDS_dtc_reportDTCByStatusMask = 0x2 + UDS_dtc_reportNumberOfDTCByStatusMask = 0x01, + UDS_dtc_reportDTCByStatusMask = 0x02, + UDS_dtc_reportDTCBySupport = 0x0A } eUdsDtc; typedef enum {