记:从零开始讲解UDS(三)——网络层

0x00 UDS概述

UDS(University Diagnostics System通用诊断系统)是一个在整车系统上经常使用的设备维护协议。其主要遵循的法规为:ISO-15765、ISO-14229,其主要协议模式脱胎于OBD(On-board diagnostics)诊断协议。经常应用在整车的各种ECU上面。是一个在整车ECU应用层开发经常使用的也是较为复杂的协议层之一。
本篇文章主要介绍了UDS关于网络层相关的简要介绍。阅读本文之前,您需要了解的一些前置技能有:

技能名称 技能熟练度 技能教程链接
CAN总线 熟悉 暂无
数据类型 熟悉 暂无
OBD 了解 暂无
整车缩写 了解 暂无

当初我想了好久,是不是要把网络层和应用层的某些特定指令放在一起说一下,因为某些指令放在网络层实现可以较为迅速的进行响应,也能避免某些奇奇怪怪的反应(超时之后才会反馈等)。但是想到每篇文章对应的层级,最后还是准备将其放在应用层上面去写。
本篇文章某些情况下,算是对《 记:从零开始讲解UDS(一)——协议概述》的承接……毕竟网络层与底层息息相关。一中主要在客户以及初学者角度介绍了一下UDS相关的帧格式。本篇文章主要是以一个开发人员的视角,将整个网络层抽象为一个可以具体实施的操作教程。

文章目录

  • 0x00 UDS概述
  • 0x01 网络层相关定义
    • 0x11 包格式定义
    • 0x21 数据最大限制
    • 0x31 传输速度最小限制
  • 0x02 后记

0x01 网络层相关定义

0x11 包格式定义

其实,UDS中,指令是作为包(package)发出的。但是UDS对于包的定义很模糊,常常会和帧相混淆(单帧Single Frame其实就是最小的包),数据的打包可以按照单独的数据长度进行判断,小于7个数据+指令以内的为单帧,大于其的为多帧。有些车厂还会要求在最后的位置加入CRC等校验或者直接选择加密。所以仅有少数的指令可以一直用在单帧格式。
而指令数据的结构也会占用部分数据格式。格式基本为:

数据名称 数据长度 备注
指令 8 单个指令最长为8位
长度 12 所有的数据长度
数据 N 一般不会超过1000

基本上普通的数据包长度约在10~50之间。比其再高的情况就是在刷写的时候。当然,这个比应用层更大。需要在应用层之后讲解。

0x21 数据最大限制

这个主要是当前的最大值限制,这个限制位最大为8位,存在于流控帧内,标志当前一包最大的发送大小以及另类的发送校验。这个值严格控制在这个数以内或者就是这个数值。在出现了于其不匹配的情况、传输超时或结束后数据最大限制与实际传输位不同的情况、传输之中出现错位的情况,ECU都会报负反馈。

0x31 传输速度最小限制

因为CAN总线中带有多个数据,为了不会过于占用当前总线空间,所以会在首诊内加入最短时间STmin,限制ECU发送数据最短的时间,而最长时间根据当前定义的诊断仪-ECU互相定义的STime1/2/3进行判断。因此,传输速度被限制在一个非常短的时间区间内。因此,普通的RTOS内的软件定时器并不能保证这个数据真的可以传输成功(如果你使用了某些RTOS的软件定时器的话),务必要使用相对稳定的硬件定时器(最好需要经过校准或使用单独的有源晶振,校准方式我会在下面的博客内简单讲解)。

0x02 后记

其实,UDS在传输层和网络层能做的很少,受益于其良好的物理层帧格式定义,已经不需要真复杂的抽象当前传输的数据格式,因此,网络层其实仅将当前数据+指令打包位为单帧或后,根据当前传输层的相关规则与限制条件进行数据传输。
下面,我将用较大的篇幅讲述关于应用层与UDS烧写相关的操作。因为UDS作为一个依托CAN协议栈的衍生协议栈,在应用层的需求很大。当然,由于UDS对底层的网络层与数据传输层进行了定义,就算脱离了CAN的协议栈也可以独立工作,仅需要将其物理层帧格式略微修改一下即可。但是要求对于当前的物理传输层需要很高的要求(一定的组网能力以及对传输速率和抗干扰能力的要求)。故在LIN总线上也可以进行使用。

你可能感兴趣的:(ECU,UDS,CAN总线)