单帧、首帧、连续帧和流控帧的概念及其作用,尤其是在ISO-TP(ISO 15765-2)协议中,这是CAN(Controller Area Network)总线上广泛使用的一种数据链路层协议。
1. 单帧 (Single Frame, SF)
定义: 单帧用于传输较短的数据包,这些数据包可以在一个数据帧内完整传输。通常适用于长度小于或等于7字节(对于标准CAN)的数据传输。
结构:
PCI (Protocol Control Information): 单帧的前4位(nibble)是帧类型标识符,表示这是一个单帧(通常标识为`0`)。
SF_DL (Single Frame Data Length): 随后的4位表示数据长度,即该单帧中实际数据的字节数(0到7字节)。
数据部分: 单帧剩余的部分则是实际的数据负载。
例子: 如果你需要传输一个包含3字节数据的消息,则可以使用单帧,数据帧中的结构可能如下:
```
+---------+---------+---------+
| PCI=0x03| Data 1 | Data 2 | Data 3 |
+---------+---------+---------+
```
应用场景: 在车辆诊断和控制通信中,很多时候需要传输的命令或状态信息都很短,单帧是高效的选择。
2. 首帧 (First Frame, FF)
定义: 首帧用于开始传输长度大于7字节的长数据包。在这种情况下,数据包被分割为多个部分,首帧传输数据的第一个部分,并告知总数据包的长度。
结构:
PCI: 前4位标识符表示这是一个首帧(通常标识为`1`)。
FF_DL (First Frame Data Length): 接下来的12位表示整个数据包的长度(0到4095字节)。
数据部分: 剩余的部分是数据包的第一个部分。
例子: 假设你要传输一个包含20字节数据的消息,你的首帧可能如下所示:
```
+---------+---------+---------+---------+---------+---------+---------+---------+
| PCI=0x10| FF_DL | Data 1 | Data 2 | Data 3 | Data 4 | Data 5 | Data 6 |
+---------+---------+---------+---------+---------+---------+---------+---------+
```
- `FF_DL`的12位二进制数将表示20(0x14),表示整个数据包有20字节。
应用场景: 首帧用于传输长数据包的初始部分,确保接收方知道即将接收的大量数据,并可以为后续的连续帧做准备。
3. 连续帧 (Consecutive Frame, CF)
定义: 连续帧用于传输在首帧之后的后续数据。当首帧发送后,数据包的其余部分通过一个或多个连续帧传输。
结构:
PCI: 前4位标识符表示这是一个连续帧(通常标识为`2`)。
SN (Sequence Number): 接下来的4位表示这是第几帧(序列号从1开始递增,循环使用0到15)。
数据部分: 剩余的部分是数据包的下一个部分。
例子: 在传输20字节的消息后,连续帧将依次传输数据,如下:
```
+---------+---------+---------+---------+---------+---------+---------+---------+
| PCI=0x21| Data 7 | Data 8 | Data 9 | Data 10 | Data 11 | Data 12 | Data 13 |
+---------+---------+---------+---------+---------+---------+---------+---------+
| PCI=0x22| Data 14 | Data 15 | Data 16 | Data 17 | Data 18 | Data 19 | Data 20 |
+---------+---------+---------+---------+---------+---------+---------+---------+
```
- `PCI=0x21`中的“1”表示序列号,`PCI=0x22`中的“2”表示下一个连续帧。
- **应用场景**: 连续帧用于完成长数据包的传输,配合首帧使用。
4. 流控帧 (Flow Control Frame, FC)
定义: 流控帧用于接收方控制发送方的数据传输速率,确保接收方能够按时处理接收到的数据而不会导致缓冲区溢出。
结构:
PCI: 前4位标识符表示这是一个流控帧(通常标识为`3`)。
FS (Flow Status): 接下来的4位表示流控状态,通常有以下几种类型:
`0` (CTS, Continue to Send): 继续发送。
`1` (Wait): 暂停发送,接收方暂时无法接收更多数据。
`2` (Overflow/Abort): 溢出或中止,接收方无法接收更多数据,传输终止。
BS (Block Size): 表示发送方可以连续发送的帧数,通常是接收方指定的。
STmin (Separation Time Minimum): 指定发送方两帧之间的最小时间间隔,确保接收方有足够时间处理数据。
例子: 假设接收方发送一个流控帧,允许发送方继续发送5个连续帧,且每帧之间至少需要等待10毫秒:
```
+---------+---------+---------+
| PCI=0x30| BS=0x05 | STmin=0x0A |
+---------+---------+---------+
```
应用场景: 流控帧用于在长数据传输过程中,协调发送方和接收方的节奏,确保传输的可靠性和有效性。
总结
单帧 (SF): 用于短数据包的完整传输,一帧即可完成。
首帧 (FF): 用于开始传输长数据包,告知总长度,并发送第一个数据片段。
连续帧 (CF): 用于传输剩余的长数据包片段,与首帧配合使用。
流控帧 (FC): 用于接收方控制发送方的数据发送速率,防止数据溢出或丢失。
这些帧类型协同工作,确保即使在复杂和拥挤的通信环境中,数据也能被可靠地传输,特别是在车辆诊断和控制领域,这些机制是至关重要的。