Мое требование - получить / отправить более 8 байтов с 29-битного идентификатора CAN. Я использую для этого слой TP. Есть ли какие-либо библиотечные функции для получения данных банки с 29-битным идентификатором? Пример: 0x1CDA00FE - тестер, а 0x1CDAFE00 - сервер.
Как получить данные CAN от 29-битного идентификатора CAN с помощью уровня TP в CAPL
Ответы (1)
Протокол не CAN-FD на канальном уровне не поддерживает полезную нагрузку более 8 байтов. Полезная нагрузка в TP, превышающая 8 байтов, обрабатывается как последовательные кадры и обычно включается в протокол упаковки, такой как UDS.
Если это идентификатор диагностического сообщения и для этого сообщения настроен уровень диагностики (UDS / KWP), в CAPL есть полная библиотека диагностики для отправки / получения запросов диагностики на настроенном уровне диагностики.
Но чтобы сделать это «вручную» (я не знаю, какой протокол использует идентификаторы ваших сообщений для отправки последовательных кадров, как в UDS):
Получение
message 0x1CDA00FE msgContainer; /*Create/ define an arbitrary instance of CAN message element*/
Вот как вы захватываете первую итерацию последовательных отправленных кадров (все они будут 8-байтовыми, но вы будете ждать их как отдельные 8-байтовые сообщения, пока целевые данные уровня TP не будут полностью отправлены вам). Таким образом, вы в основном повторяете этот фрагмент 6 раз (если ваша полезная нагрузка TP составляет 6 * 8 = 48 байтов) и делаете с msgContainer (сообщение с вашей полезной нагрузкой) все, что хотите, до тех пор, пока не появится следующий.
testwaitformessage(0x1CDA00FE,1000); //wait for the message ID to arrive in 1s
testGetWaitEventMsgData(msgContainer); /*Capture the message content from tail to toe in the msgContainer*/
write("The Byte(0) selector of the captured message for example selects the first byte of the 8 byte payload: 0x%X",msgContainer.byte(0)); // see message selectors for more options
Отправка:
byte qword QPayload=0x11223344x55667788; /*You can do with byte array also, I don't fancy to write fors now*/
message 0x1CDAFE00 messagetoSend;
messagetoSend.qword(0)=QPayload;
output(messagetoSend);
/*Prepare another payload to send as the next consecutive frame*/
...