UDS SID2E和SID22

问题描述 投票:1回答:1

在SID2E和SID22中是否存在整个帧的长度超过7个字节的情况?

如果是,那么它将如何发送或写入数据字节?

service protocols diagnostics sid automotive
1个回答
1
投票

是的,UDS中的常见用例是对SID 0x22(ReadDataByIdentifier)的响应或对SID 0x2E(WriteDataByIdentifier)的请求的长度超过7个字节。为此,使用传输层(ISO-TP, ISO 15765-2)发送由多个CAN帧组成的消息。

考虑一个普通的单帧消息,其中第一个字节的高半字节是0x0,即

0x7E0   0x03 0x22 0xF1 0x90
0x7E8   0x04 0x62 0xF1 0x90 0x01

这里有效载荷在7个字节内(在请求和响应中),因此第一个字节的低半字节告诉我们确切的长度(请求中的0x03,响应中的0x04)。由于完整的消息适合单个CAN帧,因此不需要其他任何内容。但是要发送更长的诊断消息,需要在多个CAN帧(分段)之间进行拆分。为此,需要3种不同类型的消息:

  1. 第一帧被发送到接收器以开始传输。它包含完整有效负载数据的长度(最多4095个字节)和消息的前6个字节。第一个字节的高半字节0x1表示该消息是第一帧。
  2. 确认接收第一帧的流控制帧被回复给第一帧的发送者。它包含其他信息,如预期的STmin时序和块大小。第一个字节的高半字节0x3表示该消息是流控制帧。
  3. 一个或多个连续帧被发送到接收器,其中包含多达7个字节的剩余有效负载 - 以及计数器以确保数据可以按正确的顺序去分段。第一个字节的高半字节0x2表示该消息是连续帧。

现在考虑以下场景:测试器应用程序将单帧0x7E0 0x03 0x22 0xF1 0x90作为请求发送。 ECU可能希望将响应0x62 0xF1 0x90 0x01 0x02 0x03 0x04 0x05(8字节有效负载)发送到测试器应用程序。

  1. 因此ECU将首先发送第一帧:

0x7E8 0x10 0x08 0x62 0xF1 0x90 0x01 0x02 0x03

  1. 等待测试仪应用程序的流量控制框架:

0x7E0 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00

  1. 然后ECU将继续发送连续帧,直到发送完整的消息:

0x7E8 0x21 0x04 0x05 0x00 0x00 0x00 0x00 0x00

对于SID 0x2E(WriteDataByIdentifier),它将非常相似,只是角色被反转,因为测试者应用程序通常希望在请求中发送长消息,并且ECU将使用流控制消息进行回复。即

0x7E0   0x10 0x08 0x2E 0xF1 0x90 0x01 0x02 0x03
0x7E8   0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7E0   0x21 0x04 0x05 0x00 0x00 0x00 0x00 0x00
0x7E8   0x03 0x6E 0xF1 0x90 0x00 0x00 0x00 0x00

如果需要多个连续帧,则第一个字节将从0x21增加到0x2F,然后从0x20再次开始计数。

0x7E0   0x10 0x76 0x2E 0xF1 0x90 0x01 0x02 0x03
0x7E8   0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7E0   0x21 0x04 0x05 0x06 0x07 0x08 0x09 0x0A
0x7E0   0x22 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11
...
0x7E0   0x2F 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
0x7E0   0x20 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
© www.soinside.com 2019 - 2024. All rights reserved.