• 统一诊断服务 (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的波特率进行通信。

    这个诊断服务的执行分为两个步骤:

    1. 验证ECU是否支持要调整到的目标波特率
    2. 让ECU的数据链路层和物理层转到目标波特率的通信状态

    只有当第一个步骤验证通过了,第二个步骤才可以成功执行。

  • 相关阅读:
    初识Activity
    贝叶斯公式由浅入深大讲解—AI基础算法入门【转】
    jz2440使用openjtag+openocd+eclipse调试【学习笔记】
    win10下搭建jz2440v3(arm s3c2440)开发及gdb调试环境【转】
    Eclipse安装zylin[转]
    Ubuntu 16.04下EasyOpenJTAG+OpenOCD的安装和使用【转】
    如何退出minicom【学习笔记】
    Python Matplotlib简易教程【转】
    anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
    Spyder如何在弹出框绘图【转】
  • 原文地址:https://www.cnblogs.com/Galesaur-wcy/p/13225010.html
Copyright © 2020-2023  润新知