0

我的要求是从 29 位 CAN id 接收/发送超过 8 个字节。我为此使用了TP层。是否有任何库函数用于接收来自 29 位 id 的罐头数据?例如:0x1CDA00FE 是测试仪,0x1CDAFE00 是服务器。

4

1 回答 1

0

数据链路层上的非 CAN-FD 协议不支持大于 8 字节的有效载荷。TP 中大于 8 字节的有效载荷作为连续帧处理,通常包含在打包协议中,如 UDS。

如果这是一个诊断消息 ID,并且您在此消息上配置了诊断层 (UDS/KWP),那么 CAPL 中有一个完整的诊断库可以在配置的诊断层上发送/接收诊断请求。

但是要“手动”执行此操作(我不知道什么协议使用您的消息 ID 来发送连续帧,例如在 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*/
...
于 2018-09-21T13:09:27.093 回答