Как получить данные CAN от 29-битного идентификатора CAN с помощью уровня TP в CAPL

Мое требование - получить / отправить более 8 байтов с 29-битного идентификатора CAN. Я использую для этого слой TP. Есть ли какие-либо библиотечные функции для получения данных банки с 29-битным идентификатором? Пример: 0x1CDA00FE - тестер, а 0x1CDAFE00 - сервер.


person Arul    schedule 01.03.2018    source источник
comment
Что ты имеешь в виду? Часть данных сообщений CAN составляет максимум 8 байтов, независимо от длины поля адреса. Если только вы не про CAN-FD.   -  person matli    schedule 14.03.2018
comment
@matli, тип шины CAN (500 Кбит / с). Я уже не говорю о CAN - FD. Если вы хотите передать более 8 байтов данных по шине CAN, транспортный протокол (ISO 15765) будет средством передачи данных.   -  person Arul    schedule 16.03.2018
comment
Ах, прости. У меня очень ограниченный опыт работы с ISO-TP, и я даже не думал о его существовании. Боюсь, что ничем не могу вам помочь.   -  person matli    schedule 16.03.2018


Ответы (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*/
...
person VioletVynil    schedule 21.09.2018