在UDS诊断服务中:
发送方:
应用层在写好诊断服务后,需要调用网络层接口对诊断服务的内容进行封装,封装后的内容再进一步由数据链路层进行封装,最后才能通过CAN将数据发送出去。
接收方:
接收到的CAN报文,将先后通过数据链路层和网络层对报文的封装形式,来对报文进行解析,最终提取到和应用相关的信息。
本文描述网络层对应用层诊断服务内容的封装形式。
1、单帧诊断服务
顾名思义,该类诊断服务通过一帧CAN报文即可完成诊断服务。
在网络层中,也可以对此类报文称为SF(Single Frame)。
SF第一字节的高4位为0,低4位为数据长度,其余字节为服务数据内容,没用到的数据可以按FF填充。诊断服务中,10 31等服务都属于SF,举例如下:
10 03 请求进入诊断会话模式:
02 10 03 FF FF FF FF FF
31 01 启动例程控制服务(这里02 02是检查预编程条件)
04 31 01 02 02 FF FF FF
2、多帧传输服务
当诊断数据长度超过7个字节时,就必须使用多帧传输,这里有如下三个概念:
FF(First Frame)多帧传输的第一帧,其第一字节的高4位为1,低四位+第二字节为数据长度,其余字节为服务数据内容,没用到的数据可以按FF填充。
CF(Consecutive Frame)多帧传输的连续帧,其第一字节最高四位为2,低4位为帧序号编号(0-F)。第一个连续帧的帧序号为1,之后的连续帧序号逐一增加,当序列号大于F时,重新从0开始。其余字节为服务数据内容,没用到的数据可以按FF填充。
FC(Flow Control)多帧传输的流控制帧,其第一字节高四位为3,低四位为FS流控制状态
FS
数值 | 描述 |
0 | 表示允许发送方继续发送连续帧 |
1 | 表示发送方需等待下一条流控制帧[1],该流控制帧称为等待流控制帧 |
2 | 表示报文长度超出接收方的网络层缓存大小,此流控制帧将迫使发送方中断多帧报文的发送,并且发送方网络层使用N_USData.con向应用层报告N_Result = N_Buffer_Overflow。FS = Overflow的流控制帧接收方只能在接收到第一帧后发送。 |
第二和第三字节分别为BS和ST
BS
数值 | 描述 |
0 | 表示允许发送方连续发送连续帧,而不需要等待接收方发出的流控制帧 |
1~255 | 表示允许发送方连续发送连续帧的数目,发送完成相应数目的连续帧后,发送方必须等待接收方发出的流控制帧 |
数值 | 描述 |
0~127 | 两个连续帧之间的最小间隔时间,0~127ms |
241~249 | 100~900us |
250~255 | 保留 |
其余字节为服务数据内容,没用到的数据可以按FF填充。
实际应用中,像一些数据传输功能都是多帧传输,举例如下:
10 0B 34 00 44 00 00 20 FF
30 00 00 FF FF FF FF FF FC
21 00 00 00 00 18 FF FF CF
其中,FF定义的数据长度为00B为11,FC表示允许发送方继续发送连续帧,CF为连续帧的第一帧和最后一帧。
以上也是对15765.2网络层本质的描述。