В настоящее время я разрабатываю тестовые примеры в CANoe, используя язык CAPL. Моя цель — захватить и сохранить весь кадр CAN в том виде, в котором он появляется на трассе, а не только содержащийся в нем сигнал. Хотя я понимаю, как это сделать в сетевом узле с помощью события on message{}, я столкнулся с трудностями при реализации этого в TestCase. В частности, я стремлюсь к выполнению тестового примера, получению текущего значения кадра CAN и продолжению запланированных процедур тестирования. Мы будем очень признательны за любые идеи или предложения по реализации этой функциональности в среде TestCase.
Сначала я попытался использовать системные переменные CANoe, но нашел это громоздким из-за необходимости создания множества системных переменных для каждого кадра CAN. Этот подход оказался неэффективным для моих требований.
Набор функций тестирования 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
Если вы хотите работать с определенным типом сообщения, вы можете использовать одну из перегрузок вышеупомянутых функций.
@MohamedHamed Должно работать, как описано. Просто используйте testWaitForMessage(msg_id, 10000)
Спасибо @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("===================== = ");
}
}
Я пытаюсь обработать определенное сообщение, используя его идентификатор, я хочу прочитать полный 64-байтовый кадр CAN FD и обработать его