CAN-TP作用
CAN Transport Layer Protocol,是一种用于控制器区域网络(CAN)的传输层协议。CANTP为CAN提供了大容量数据的传输,可以将较大的数据分为多个小数据帧进行传输,并在发送和接收端进行重新组装。暴力一点的理解,CANTP的作用就是组包,拆包,传输超时反馈。
我们知道CAN的一帧标准数据帧可携带8字节的数据,那么如果要传输的数据字节大于8字节要怎么传输呢?一帧明显搞不定,那就把它拆成多帧发出去就行了,每次最多传输4095字节长度报文。在此之前必须要了解网络层中一个非常重要的东西,N_PDU.
网络层协议数据单元(N_PDU,Network_Protocol Data Unit),包含以下三个部分
1)N_AI 地址信息
2)N_PCI 协议控制信息
3)N_Data 数据
PDU的功能主要是明确四种帧的类型(用于拆包和组包)。以下是PUD的格和类型,这里简单化的来说就是四种类型帧的格式。
当数据长度小于8字节,一帧单帧就可以解决了,当数据长度比较大时,例如VIN17位,就需要拆包进行多帧传输数据,以下是多帧时序,这个需要理解看懂。
当发生比较长的报文的时候,将报文拆分成首帧+连续帧。首先发生放发一帧首帧,接收方收到后会回复一帧流控帧(告诉发送方自己的接收能力以及操作指示),发送方收到流控帧继续发送的指示后,将剩余的数据以连续帧的形式发送,然后依次往复,直到所有数据传输完毕。
简单粗暴理解四种帧类型
单帧 SF (Single Frame) 数据长度若不超过7字节,单帧一帧就可以搞定。(为什么是七个字节的数据,这里是因为第一个byte被占用了,后面只有七个byte的空位了)
例如收到:04 11 22 33 44 55 55 55
此时第一个字节04 ,0代表这是一个单帧,4表示这一帧后面带着四字节数据。
11 22 33 44 是这一单帧携带的数据,后面的55 55 55 是填充位。
首帧FF (First Frame)
例如收到了 10 22 22 22 22 22 22 22 第一个字节的1 代表这是一帧首帧 0 22代表数据长度,代表传输的数据一共有34个字节,首帧先传6字节,后面的用连续帧补上。后面的6个22 都是携带的数据。
流控帧 FC (Flow Control Frame)
FS (flow state) 流状态: 用于记录当前的流量控制情况,包括发送方可以发送的数据量、接收方的处理能力等信息。暴力理解,一共三种情况。
FS=0 请继续发送(接收能力完全没问题)
FS=1 请等待(有点接受不过来了,先不要发,等通知)
FS=2 过载了(太多了,接受不了了)
BS (block size) 块大小: 接收方能够接收的最大数据块数量。
BS=0 告诉发送方再不要发流控帧了,可以一直发送(CF发送)数据。
BS=01~FF 告诉发送方在没有接受流控帧期间能发送的最大数目的连续帧
STmin (ms): 发送连续帧之间的间隔
例如收到报文 30 00 14 AA AA AA AA AA
3 表示是一个流控帧,0表示允许我方继续发送数据,00表示可以无限制的发连续帧
14 表示连续帧与连续帧直接的最小时间间隔是20ms。
连续帧 CF (Continue Frame)
连续帧第一包编号是1!后面到F后,第一次循环后,才从0开始!
21+数据 20+数据 20+数据
22+数据 21+数据 。
23+数据 22+数据 。
。 。 。 。 。 。
。 。
。 。
2F加数据 2F加数据
直到发完最后一包结束。