Захват целых кадров CAN в тестовых примерах CANoe с использованием языка CAPL

В настоящее время я разрабатываю тестовые примеры в CANoe, используя язык CAPL. Моя цель — захватить и сохранить весь кадр CAN в том виде, в котором он появляется на трассе, а не только содержащийся в нем сигнал. Хотя я понимаю, как это сделать в сетевом узле с помощью события on message{}, я столкнулся с трудностями при реализации этого в TestCase. В частности, я стремлюсь к выполнению тестового примера, получению текущего значения кадра CAN и продолжению запланированных процедур тестирования. Мы будем очень признательны за любые идеи или предложения по реализации этой функциональности в среде TestCase.

Сначала я попытался использовать системные переменные CANoe, но нашел это громоздким из-за необходимости создания множества системных переменных для каждого кадра CAN. Этот подход оказался неэффективным для моих требований.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
181
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Набор функций тестирования CANoe предоставляет такие функции, как testWaitFor... для ожидания определенного события, и такие функции, как testGet..., для получения данных.

В вашем случае вы можете использовать testWaitForMessage, чтобы дождаться, пока в шине не появится сообщение CAN, а затем testGetWaitEventMsgData.

В своем вопросе вы не указываете, хотите ли вы действовать по определенному сообщению или просто по любому сообщению.

Если предположить последнее, ваш код может выглядеть так:

long result;
message * MyMessage

result = testWaitForMessage(10000 /* timeout */);
if (result < 0) {
  return;
}

result = testGetWaitEventMsgData(MyMessage);
if (0 != result) {
  return;
}
// process MyMessage

Если вы хотите работать с определенным типом сообщения, вы можете использовать одну из перегрузок вышеупомянутых функций.

Я пытаюсь обработать определенное сообщение, используя его идентификатор, я хочу прочитать полный 64-байтовый кадр CAN FD и обработать его

Mohamed Hamed 29.04.2024 15:38

@MohamedHamed Должно работать, как описано. Просто используйте testWaitForMessage(msg_id, 10000)

mspiller 29.04.2024 18:13

Спасибо @mspiller Answer, я учел его отзыв и вот обновленную версию моего кода.

Я делюсь этим здесь, чтобы помочь всем, кто может искать подобное решение.

void ProcessMessage(int messageId)
{
    int result;          // Used to store return values from functions.
    message 0 MyMessage; // Used to store Message INFO
    
     result = testWaitForMessage(messageId, 10000);
    if (result < 0)
    {
        // Log error if the message could not be received within the timeout period.
        write("Error: Message 0x%X not received within timeout.", messageId);
    }
    else
    {
        // Log success if the message is received.
        write("Message 0x%X received successfully.", messageId);
    }

    // Attempt to retrieve the message data.
    result = testGetWaitEventMsgData(MyMessage);
    if (result != 0)
    {
        // If there's an error retrieving message data, log an error message.
        write("Error: Failed to retrieve message data.");
    }
    else
    {
        // If data is successfully retrieved, display the message content.
        write("Message DLC = %d", MyMessage.dlc);  
        write("Total Data length = %d", MyMessage.DataLength);

        // Print each byte of the message data.
        write("===================== = ");
        for (int i = 0; i < MyMessage.DataLength; i++)
        {
            write("Data byte %d = 0x%X", i, MyMessage.byte(i));
        }
        write("===================== = ");
    }
}



Другие вопросы по теме