统一诊断服务 (Unified diagnostic services , UDS) (三)
转载来自知乎:https://zhuanlan.zhihu.com/p/33852614 张丁
我用来画重点地 可以去知乎看博主的哈 写的很好
CommunicationControl (0x28)
该服务用于打开/关闭某些类别的报文的发送/接收。它通常在刷写软件或大量数据的时候使用,因为在刷软件或参数的时候并不需要ECU进行与通信相关的功能,将通信关闭之后可以把所有通信资源都留给软件或参数的下载,当下载过程完成之后再利用该服务将通信恢复即可。
0x28服务的格式如下图所示
0x28服务的格式
第一部分即SID,一个byte,值为0x28;
第二部分是sub-function,表明要对ECU的通信进行哪种控制,具体包括 :
0x00 enableRxAndTx (激活接收和发送)
0x01 enableRxAndDisableTx(激活接收和关闭发送)
0x02 disableRxAndEnableTx(激活发送和关闭接收)
0x03 disableRxAndTx(关闭接收和发送)
0x04 enableRxAndDisableTxWithEnhancedAddressInformation(激活接收和关闭发送,针对特定的地址)
0x05 enableRxAndTxWithEnhancedAddressInformation(激活接收和发送,针对特定的地址)
0x06 - 0x7F都是保留或者留给厂商自定义的。
第三部分表明这条诊断请求要对哪种报文进行控制,长度为1个byte,定义如下表所示:
communicationType的定义
这个byte中最常用的就是低2 bit,0x1代表普通应用报文,0x2代表网络管理报文,0x3代表普通应用报文和网络管理报文。
第四部分是optional的,只有当sub-functional等于0x04或0x05时才需要使用。
举个完整的诊断服务例子:
28 01 01 表示激活应用报文的接收并关闭应用报文的发送(网络管理报文不受影响)。
28 00 01 表示激活应用报文的接收和发送(网络管理报文不受影响)。
TesterPresent (0x3E)
这个诊断服务的用处可以通过它的名字很明显地得知,即告知ECU诊断仪还在连接着。在上一篇文章中我说到了关于session的部分,如果没有诊断命令的发送和接收,ECU将从non-default session中回退到default session, 0x3E就是用于使ECU保持在当前session。
这应该是UDS中最简单的一个诊断服务了,它永远只有两个byte,格式如下:
0x3E诊断服务的格式
当sub-function是0x00时,ECU要给出response;当sub-function是0x80时,ECU不需要要给出response。
一般来说主机厂会为这个服务定义两个时间参数,
一个参数用于规定自己的诊断仪发送0x3E服务的间隔,
另一个参数用于定义ECU收不到0x3E服务的timeout时间。
ControlDTCSetting (0x85)
该服务用于控制ECU的DTC存储,这个服务常常和前面提到的28服务一起使用,比如,在开始写参数之前,为了获得更快的传输速度,我们用28服务把所有ECU的通信关闭了,但此时因为收到不到相关的报文,ECU会没有必要地存储很多DTC,这时如果我们使用85服务把ECU存储DTC的功能暂时性地禁止掉,则不会造成这种麻烦。
0x85服务的格式
第一部分即SID,一个byte,值为0x85;
第二部分是sub-function,表明是打开还是关闭ECU的DTC存储,具体包括 :
0x01 on
0x02 off
第三部分是optional的,由各家自己定义,比如,可以用FF FF FF 来表示这条诊断命令针对所有的DTC。
ResponseOnEvent (0x86)
我在以前的文章里说,诊断通信过程是问答式的,诊断仪发请求,ECU给响应。
0x86服务算是一个例外,在ECU收到这条0x86服务之后,当DTC产生时,它会自动地上报DTC及相关环境数据,直到用另一条0x86服务来关闭ECU的这个行为。
该功能主要用于ECU的前期开发阶段,在售后和生产中是不会用到的,而且该服务的格式复杂(即可变的参数很多),执行它还分为好几个步骤,我就不详细写了。
LinkControl (0x87)
这个服务用于转化ECU数据链路层和物理层的状态,比如,在高速CAN上的ECU正常通信速率是500 kbit/s,但它同时也支持1M bit/s的波特率,如果需要刷写大量数据,便可以利用这条诊断服务让ECU以1M bit/s的波特率进行通信。
这个诊断服务的执行分为两个步骤:
- 验证ECU是否支持要调整到的目标波特率
- 让ECU的数据链路层和物理层转到目标波特率的通信状态
只有当第一个步骤验证通过了,第二个步骤才可以成功执行。