目录
- 一、报文的拆装和重组
- [1.1 数据包的序列号](#1.1 数据包的序列号)
- [1.2 数据包的拆装](#1.2 数据包的拆装)
- [1.3 数据包的重组](#1.3 数据包的重组)
- 二、传输协议连接管理中的报文类型
- [2.1 连接模式下的请求发送报文 TP.CM_RTS](#2.1 连接模式下的请求发送报文 TP.CM_RTS)
- [2.2 连接模式下的准备发送报文 TP.CM_CTS](#2.2 连接模式下的准备发送报文 TP.CM_CTS)
- [2.3 消息结束应答报文 TP.CM_EndofMsgACK](#2.3 消息结束应答报文 TP.CM_EndofMsgACK)
- [2.4 放弃连接报文 TP.Conn_Abort](#2.4 放弃连接报文 TP.Conn_Abort)
- [2.5 广播公告报文 TP.CM_BAM](#2.5 广播公告报文 TP.CM_BAM)
- [2.6 数据传送报文 TP.DT](#2.6 数据传送报文 TP.DT)
- 三、多组消息广播
- [3.1 发送TP.CM_BAM报文](#3.1 发送TP.CM_BAM报文)
- [3.2 发送报文的时间间隔](#3.2 发送报文的时间间隔)
- 四、连接模式下的多字节发送(无错误情况)
- [4.1 发送节点发送 TP.CM_RTS 报文](#4.1 发送节点发送 TP.CM_RTS 报文)
- [4.2 传输报文的时间间隔 1](#4.2 传输报文的时间间隔 1)
- [4.3 接收节点发送TP.CM_CTS应答报文](#4.3 接收节点发送TP.CM_CTS应答报文)
- [4.4 传输报文的时间间隔 2](#4.4 传输报文的时间间隔 2)
- [4.5 发送节点发送前2个 TP.DT 报文](#4.5 发送节点发送前2个 TP.DT 报文)
- [4.6 接收节点发送2个 TP.CM_CTS 报文](#4.6 接收节点发送2个 TP.CM_CTS 报文)
- [4.7 发送节点发送3、4包数据](#4.7 发送节点发送3、4包数据)
- [4.8 接收节点发送 TP.CM_EndofMsgACK 报文,数据接收完毕](#4.8 接收节点发送 TP.CM_EndofMsgACK 报文,数据接收完毕)
- 五、连接模式下的多字节发送(有错误情况)
一、报文的拆装和重组
对于报文发送方而言,长度大于8字节的报文无法用一个单独的CAN数据帧来装载。因此,它们必须拆分为若干个小的数据包,然后使用单独的数据帧对其进行逐一的、分包传送。
对于报文接收方而言,接收方必须能够接收这些单独的数据帧,然后解析各个数据包并重组成发送方发过来的原始报文信息。
1.1 数据包的序列号
上文提到,帧数据单元(8bit)中的第一个bit是数据包序列编号。序列编号在数据拆装时分配给每个数据包,然后通过网络传送给接收方。接收方成功接收后,利用这些编号把数据包重组回原始信息。序列编号将从1开始依次分配给每个数据包,直到整个数据都被拆装和传送完毕。其编号范围为1-255,所以多帧传输的最大数据长度为255 x 7 = 1785个。
1.2 数据包的拆装
数据包的拆装工作是需要发送方完成的工作。每个数据包都装载着序列编号和原始数据的7个字节。最后一个数据包的8个字节包含序列编号和至少一个原始字节,其余的字节全部设置为0xFF。
1.3 数据包的重组
数据包的重组工作是需要接收方完成的工作。接收方按照数据包顺序陆续接收到数据包后,按照数据包顺序号重新将多个数据包组合起来。
二、传输协议连接管理中的报文类型
传输协议连接管理中的报文(TP.CM)用于建立、关闭连接以及控制数据流。传输协议提供了6种传输协议连接管理报文:连接模式下的请求发送报文、连接模式下的准备发送报文、消息结束应答报文、放弃连接报文、广播公告报文和数据传送报文。同时TP.CM的PGN值是60416(0x00EC00),也就是说和TP.CM相关的所有报文都为236(0xEC),默认优先级是7,DP为0,R为0。
2.1 连接模式下的请求发送报文 TP.CM_RTS
TP.CM_RTS消息用于通知一个节点,在网络上有另一个点希望和它建立一个虚拟连接,并告诉接收方将要发送数据的字节数量、分成多少包、数据的PGN编码。
2.2 连接模式下的准备发送报文 TP.CM_CTS
TP.CM_CTS用于回答请求发送消息,它通知对方节点,已经准备好接收一定量的长消息数据,包括能接收多少包数据(一次不多于5包)、下一数据包编号、数据的PGN编码。
2.3 消息结束应答报文 TP.CM_EndofMsgACK
TP.CM_EndofMsgACK消息由长消息的响应者传送给消息的发送者,表示整个消息已经被接收并正确重组。
2.4 放弃连接报文 TP.Conn_Abort
TP.Conn_Abort 消息用于让虚拟连接中的任一节点在没有完成整个消息的传输时关闭连接。无论是发送者还是响应者,在数据传输完成之前,由于任何原因(包括超时)决定关闭连接时,它都应该发送一条放弃连接消息。
2.5 广播公告报文 TP.CM_BAM
TP.CM_BAM 消息用于通知网络上所有节点将要广播一条长消息,包括一共有多少个字节、分成了多少个数据包、数据的PGN编号。
2.6 数据传送报文 TP.DT
TP.DT 消息用于把一包一包的数据发送出去,当然,发送之前需要明确所发送数据的PGN,不能发错。
三、多组消息广播
3.1 发送TP.CM_BAM报文
BAM消息规划好即将广播的长消息的参数群编号、消息字节数量和它被拆装的数据包的数目,然后使用数据传输PGN(60160,TP.DT)来发送相关的数据。如图为广播数据传送顺序示例图:一个节点向网络表示,它将要使用传输协议的服务来传送一个多组消息。在这个例子中,PGN(65260,车辆身份标识符)在网络中广播。发送节点首先发出了一条TP.CM_BAM消息,随后发送数据包。所有的响应者都没有进行接收确认。
3.2 发送报文的时间间隔
对于发送节点而言,J1939规定:多组广播消息中,数据包之间所需要的时间间隔是50-200ms。也就是说发送节点发送完一个报文后,在自己的MCU中设置一个定时器,定时范围为50-200ms,比如定时器150ms,过150ms后再发送下一包数据,以便让接收节点有时间接收这些数据包。
对于接收节点而言,J1939规定:多组广播消息中,当接收节点收到一个数据包后,等待下一个数据包的时间间隔不大于750ms。也就是说,接收节点接收完一包数据,然后最多等待750ms,如果750ms内发送节点没有把下一包数据发过来,接收节点就会认为连接关闭。
四、连接模式下的多字节发送(无错误情况)
通常情况下,RTS/CTS协议下无传送错误的数据传输会按照下图的数据流模式进行。假设发动机电控单元(0x00)作为发送节点,变速器的电控单元(0x03)作为接收节点,两者之间传输组件识别标识符PGN65259(0x00FEEB) 。
4.1 发送节点发送 TP.CM_RTS 报文
发动机电控单元向变速器的电控单元发送TP.CM_RTS报文,告诉变速器的电控单元"我要发送参数群编号PGN为65259的一组数据给你,总共23个字节数据,分4包发给你"。结合2.1的报文结构,发出的TP.CM_RTS报文为:0x88 0x1c 0xEC 0x03 0x00 0x10 0x17 0x00 0x04 0xFF 0xEB 0xFE 0x00
4.2 传输报文的时间间隔 1
针对接收节点而言,变速器的电控单元收到发动机电控单元发过来的TP.CM_RTS后,需要在200ms内回复TP.CM_CTS应答报文,否则视为连接失败。
针对发送节点而言,发动机电控单元向变速器的电控单元发送TP.CM_RTS报文后开始计时等待;如果在1250ms内没有收到变速器的电控单元发送的TP.CM_CTS应答报文,视为放弃连接。
4.3 接收节点发送TP.CM_CTS应答报文
变速器的电控单元向发动机电控单元发送TP.CM_CTS应答报文,表示它已准备好接收2个数据包,从编号1开始。因此,变速器发出的TP.CM_CTS报文为:0x88 0x1C 0xEC 0x00 0x03 0x11 0x02 0x01 0xFF 0xFF 0xEB 0xFE 0x00
4.4 传输报文的时间间隔 2
针对发送节点而言,发动机电控单元收到变速器的电控单元发过来的TP.CM_CTS响应报文后,证明连接正常;200ms内发出第一个数据包,下一个200ms发送第2个数据包。
针对接收节点而言,变速器的电控单元发送TP.CM_CTS响应报文后计时1250ms,如果在这1250ms内没有收到发动机电控单元发过来的第1包数据,就认为连接失败;正常接收到第一包数据后,计时750ms,如果在750ms内没有收到发动机电控单元发过来的第2包数据,就认为连接失败。
4.5 发送节点发送前2个 TP.DT 报文
发动机电控单元向变速器电控单元发送TP.DT,先发送前2包数据。
4.6 接收节点发送2个 TP.CM_CTS 报文
变速器电控单元发出的第一个TP.CM_CTS报文为:0x88 0x1C 0xEC 0x00 0x03 0x11 0x00 0xFF 0xFF 0xFF 0xEB 0xFE 0x00
上述报文中,可接收数据包的数量是0x00,下一个发送的数据包编号是0xFF,表示变速器电控单元想和发动机电控单元保持连接,但不能马上再接收任何数据包。在最长延迟500ms后,变速器电控单元必须再发一条TP.CM_CTS消息来保持连接。在这个例子中,响应者变速器电控单元再发送了一条TP.CM_CTS消息,表示它可以接收从编号3开始的两个数据包。第二个TP.CM_CTS报文为:0x88 0x1C 0xEC 0x00 0x03 0x11 0x02 0x03 0xFF 0xDD 0xEB 0xFE 0x00
4.7 发送节点发送3、4包数据
发送剩余数据包,不足用0xFF填充。
4.8 接收节点发送 TP.CM_EndofMsgACK 报文,数据接收完毕
变速器电控单元向发动机电控单元发送TP.CM_EndofMsgACK,表示所有数据接收完毕,现在关闭连接。结合2.3报文结构,该TP.CM_EndofMsgACK报文为:0x88 0x1C 0xEC 0x00 0x03 0x13 0x00 0x04 0xFF 0xEB 0xFE 0x00
五、连接模式下的多字节发送(有错误情况)
在这种情况下,发送请求与前面的例子相同,通过同样的方式发送。发动机电控单元发送完毕1和2两个数据包后。响应者变速器电控单元认为2号数据包中有错误。然后变速器电控单元发送了一条TP.CM_CTS消息:0x88 0x1C 0xEC 0x00 0x03 0x11 0x02 0xFF 0xFF 0xEB 0xFE 0x00表示它想让发动机电控单元再单独发送一次2号数据包。
发送者发动机电控单元回应,并再次发送了2号数据包。接着,响应者变速器电控单元发出了一条CTS消息,表示它想要从编号3开始的2个数据包,这条消息同时也确认了2号数据包已经被正确接收了。
其余的传输过程和无错误传输数据流模式相同,一旦最后一个数据包被正确接收,则响应者发送一条TP.CM_EndofMsgACK消息,表示整个消息已经被正确接收了。