In SID2E and SID22 is there a condition where the length of the entire frame will exceed 7 bytes?
If yes then how it will send or write tha data bytes?
In SID2E and SID22 is there a condition where the length of the entire frame will exceed 7 bytes?
If yes then how it will send or write tha data bytes?
是的,UDS 中的一个常见用例是对 SID 0x22
(ReadDataByIdentifier) 的响应或对 SID 0x2E
(WriteDataByIdentifier) 的请求的长度超过 7 个字节。为此,使用传输层(ISO-TP、ISO 15765-2)发送由多个 CAN 帧组成的消息。
考虑一个普通的单帧消息,其中第一个字节的高半字节是0x0
ie
0x7E0 0x03 0x22 0xF1 0x90
0x7E8 0x04 0x62 0xF1 0x90 0x01
这里的有效载荷在 7 个字节内(在请求和响应中),所以第一个字节的低半字节告诉我们确切的长度(0x03
在请求中,0x04
在响应中)。由于完整的消息适合单个 CAN 帧,因此不需要其他任何内容。但要发送更长的诊断消息,需要将其拆分为多个 CAN 帧(分段)。为此,需要 3 种不同类型的消息:
0x1
字节表示该消息是第一帧。0x3
字节表示该消息是一个流控制帧。0x2
字节表示该消息是一个连续帧。现在考虑以下场景:测试器应用程序将单个帧0x7E0 0x03 0x22 0xF1 0x90
作为请求发送。ECU 可能希望将响应0x62 0xF1 0x90 0x01 0x02 0x03 0x04 0x05
(8 字节有效负载)发送到测试仪应用程序。
0x7E8 0x10 0x08 0x62 0xF1 0x90 0x01 0x02 0x03
0x7E0 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x7E8 0x21 0x04 0x05 0x00 0x00 0x00 0x00 0x00
对于 SID 0x2E
(WriteDataByIdentifier),它将非常相似,只是角色互换了,因为通常测试器应用程序希望在请求中发送长消息,并且 ECU 将使用流控制消息进行回复。IE
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
up to增加0x2F
,然后从0x20
to 重新开始计数。
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