之前聊到,汽车电控诊断有诸多的通信协议,在车辆发生故障时,或者故障后,诊断仪或者在线诊断设备需要读取控制器中的数据,数据在车辆中基本上还都是通过串行总线传输的(无论是CAN、K、L、IP),既然是串行总线,一般都是有规定传输的头、尾,以及中间的数据部分,数据部分一般也会约定最大传输的字节,以及校验方式。
这个也就是通信过程中讲的 数据链路层的通信协议的约定。
我们也看到其实,遇到故障时,有时候要读取的内容很多,有时候一个数据包承载不了全部的数据,就是要涉及到网络层的数据拆分。
为了在诊断应用过程中不去理会实际的物理总线的格式和通讯要求,诊断系统也按照通讯模型,将网络层拆分出来。以基于CAN总线的UDS为例 ,我们来看一下ISO15765-2 中的网路层定义的功能,其实最主要的就是拆、组包,以及超时控制。
拆包和组包
-
组包:当需要发送的数据量超过单个CAN数据帧所能承载的容量时(通常为8字节),数据会被分成多个部分,这个过程称为组包。组包会创建一系列的CAN数据帧,每个数据帧都包含一部分数据,以及必要的控制信息,比如序列号和传输请求。
-
拆包:当接收方收到这些分散的CAN数据帧时,需要将它们重新组合成原始的大数据单元,这个过程称为拆包。拆包过程涉及到识别数据帧的序列号,按照正确的顺序重新组装数据,并验证数据的完整性。
为了实现拆包组包的过程,将CAN分成了一下4种类型:
N_PDU name | N_PCI bytes | |||
Byte #1 | Byte #2 | Byte #3 | ||
Bits 7~4 <N_PCIType> | Bits 3~0 | |||
Single Frame (SF) | 0 | SF_DL | N/A | N/A |
First Frame (FF) | 1 | FF_DL | ||
Consecutive Frame (CF) | 2 | SN | N/A | N/A |
FlowControl(FC) | 3 | FS | BS | STmin |
1、单帧(SF)
不需要拆包解包,用一帧8字节可以传输完成
其中第一个字节高4位为0 表示这是一个单帧
第4位表该帧的数据长度,应用时取值1~7
2、多帧
多帧传输,是有 首帧(FF)、连续帧(CF)、流控帧(FC) 三种类型的帧一起控制的
-
首帧(FF)是 发送方发给接收方的,作为整个通信的初始化过程,首帧有12个bits 来表示数据长度(FF_DL),理论上最多支持4095个字节的数据。然后首帧中剩下的字节就开始依次的传递数据
-
接收方收到首帧后,发送流控帧(FC),告诉发送方接收能力,包含FS(FlowStatus)、BS(BlockSize)、STmin(SeparationTime)
-
FS:有三个状态,0 继续发送;1 等待,通知等待新的流控帧; 2 溢出,仅在接收首帧判断数据无法接收时发出
-
BS:00,后续不再发流控帧,发送方顺序发完所有数据;01~FF,在下个流控帧到来前,可以发送的最大数目的连续帧数
-
STmin:定义了在连续发送的CAN帧之间的最小时间间隔。这个时间间隔是必要的,以确保网络中的所有节点都有足够的时间来处理接收到的数据。00~7F,单位为ms:0~127ms;F1~F9,单位为us:100us~900us;其他位为保留位。
-
-
接收方收到流控信息后,应该按照流控信息中的FS、BS、STmin 的信息约束,进行连续帧(CF)的发送。第一字节的低四位表达连续帧的顺序,0~15 循环使用
无论是单帧还是多帧,后面的数据内容呈现的就是我们SID涉及的各种服务和响应了。
地址
除了CAN帧的数据部分,在通信过程中,CAN的ID有时也会设计和定义赋予特殊的功能,在UDS中,对于标准帧 CANID为11位,采用的是统一编码,标准固定地址。
但是扩展帧CANID 为29位时,可以支持一些特定的用法:
-
bit23~16 : 为 N_TAtype,表示地址类别,218为物理地址,219表示功能地址
-
bit15~8:表示目的地址
-
bit7~0:表示源地址
超时
在多帧的发送和响应过程中还有一些超时的响应方法和控制,相关的参数要求在 ISO15765-2中被严格的定义了,大部分的超时控制时间是1s,其余详细的运行要求直接参考协议中的定义了。
对于诊断开发工程师来说,通常不太需要关心这个部分,这个部分已经有基础软件协议栈自动完成,但是对于诊断测试工程师来说,了解这一通讯过程,对原始总线数据进行分析还是比较有帮助的。