Тайм-аут UDS SecurityAccess/SessionControl в Python (udsoncan/isotp), когда моделирование ECU выполняется в CANoe (CAPL)Python

Программы на Python
Ответить
Anonymous
 Тайм-аут UDS SecurityAccess/SessionControl в Python (udsoncan/isotp), когда моделирование ECU выполняется в CANoe (CAPL)

Сообщение Anonymous »

Я реализую инструмент прошивки UDS в Python, используя udsoncan и python-can-isotp.

Настройка следующая:
  • Клиент Python → отправляет запросы UDS через CAN-интерфейс Kvaser.
  • CANoe CAPL скрипт → действует как ECU, отвечает на диагностические службы.
Проблема
Некоторые службы (например, ECUReset 0x11) работают нормально:
Журнал Python:

Код: Выделить всё

Tx:  0211010000000000
Rx:  0251010000000000
Received positive response for ECUReset (0x11)
Но время ожидания других служб, таких как DiagnosticSessionControl (0x10) или SecurityAccess (0x27):
Журнал Python:

Код: Выделить всё

Tx:  0210020000000000
RAW CAN: ID=0x7EC, Data=065002003201f400
TimeoutException – Did not receive IsoTP frame in time
Трассировка CANoe:

Код: Выделить всё

ID=7EC  Data=06 50 02 00 32 01 F4 00
Таким образом, Python явно видит кадр CAN, но isotp/udsoncan отбрасывает его → тайм-аут.

Мой код CAPL (упрощенный)

Код: Выделить всё

case 0x10: // DiagnosticSessionControl
{
byte resp[8];
resp[0] = 0x50;
resp[1] = data[1];
resp[2] = 0x00;
resp[3] = 0x32;
resp[4] = 0x01;
resp[5] = 0xF4;
CanTpSendData(gHandle, resp, 6);
write(">> Session Control 0x%02X", data[1]);
}
break;

case 0x27: // SecurityAccess
{
byte resp[8];
resp[0] = 0x67;
resp[1] = data[1];
resp[2] = 0x12;
resp[3] = 0x34;
resp[4] = 0x56;
resp[5] = 0x78;
CanTpSendData(gHandle, resp, 6);   // send seed
write(">> Sent seed.");
}
break;
Что я ожидаю
Для SessionControl (0x10) ответ должен быть следующим:

Код: Выделить всё

50 02 00 32 01 F4
(всего 6 байт).
Для SecurityAccess (0x27, sub 0x01) ответ должен быть следующим:

Код: Выделить всё

67 01 12 34 56 78
(всего 6 байт).

Что происходит на самом деле
CANoe отправляет 8-байтовые кадры с завершающим заполнением 00, например:

Код: Выделить всё

06 50 02 00 32 01 F4 00
06 67 01 12 34 56 78 00
Python isotp ожидает ровно 6 байт полезной нагрузки, поэтому он отклоняет сообщение → тайм-аут.

Мой вопрос
  • Почему CanTpSendData(gHandle, resp, 6) по-прежнему приводит к 8-байтовому кадру CAN?
    />
  • Как заставить симуляцию CANoe CAPL отправлять именно то количество байтов UDS, которое я указал (без заполнения), чтобы udsoncan/isotp принял это?
  • Существует ли лучшая практика обработки заполнения между Python isotp и CANoe CAPL?
Что я пробовал
  • Код: Выделить всё

    CanTpSetPadding(gHandle, 0x00);
    (по-прежнему отправляет 8-байтовые кадры с дополнительными нулями).
  • Инициализация массива нулями (

    Код: Выделить всё

    byte resp[8] = {0};
    ) перед заполнением.
  • Различные значения для len в CanTpSendData.


Подробнее здесь: https://stackoverflow.com/questions/797 ... p-when-ecu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»