结合实例讲解UDS诊断中的—会话Session的切换

1、基础知识

1.1、常见的几种会话

1.2 会话之间的跳转

这里跳转,我们暂时不关注 10 04 会话和其他会话之间的关系

从这张图中可以读取很多信息和注意事项

注意点1:会话跳转顺序,10 01 default会话不能直接跳转到10 02 Programming会话和10 06会话中间需要先经过 10 03 Extened会话

注意点2:Extened会话和Programming会话之间的跳转关系,只能由10 03-》10 02 ,注意只能是单向跳转。

注意点3:10 03《-》10 06之间可以相互跳转。

注意点4:任何非默认会话状态下,都可以通过10 01指令回到 Default Session中去。

注意点5:任何会话状态下都可以,再次对应的指令,重新进入相同的会话状态,如图中Default会话可以通过10 01再次进入efault会话。

注意点6:任何会话状态下,都可以使用复位服务(11 01)和(11 03)再次回到default 会话中。

1.3 区分几种会话的目的 

      做过实际项目的同学都知道,UDS诊断协议也就是ISO14229,之所以要花费精力来将会话等级做出划分,本质上是一种安全机制,配合0x27服务来实现。

        这种会话等级划分机制,保证了,那些服务只有在特定会话模式下,才能被使用,如0x34、0x35、0x36、0x37服务,只能在10 02编程会话下,才能使用。而进入编程会话前,还需要执行0x27安全解锁服务。这种机制下,就确保了MCU内的程序不会被恶意篡改。

2 会话跳转和BootLoad、APP之间的联系

1. 大家可以从Start中开始看,很多同学一看到外部重编程请求,这个判断语句时,就开始不了解是什么意思了,可以暂时理解为一个信号标志位,至于这个标志位如何触发=1,我们看到后面就明白了。

为了方便大家和自己的理解,我们按照实际项目测试中,操作步骤,分解开来看这张图,如下图

步骤1:

       通常我们KL30 和KL31(也就是地线),连接到被测样件DUT上,然后KL15上电,启动重启。重启先执行一部分初始化过程,初始化后,进入判断“外部重编程请求”,此时我们没有任何操作,外部重编程请求可以看作=0。

步骤2:

      流程流转到,判断应用程序是否有效 ,(也就是我们有没有把APP烧录进去MCU中),此处可以理解为,当MCU中的FLASH中存在APP时,存在一个APP_In_Flash_Flag 标志位=1。然后延时20ms。

步骤3:

当20ms延时结束时,这时才会真的进入 App的Default模式下

步骤4:我们单独来看进入APP默认会话后的流程

   步骤4:如何进入Programing Session 会话,此步骤又可以划分为,另外几个不同的步骤

    步骤4.1 :可以执行会话之间的转换,10 01 -10 03之间的相互转换

   步骤4.2:在拓展会话中,接收到10 02 指令后,并没有直接进入编程会话模式,而是“置外部重编程请求=01”,然后执行重启操作。哈哈!!是不是有点突破了以往的认知。

  步骤4.3:执行重启操作后,流程其实就是按照上图的步骤执行,

 步骤4.4 :执行完初始化后,就开始检查“外部重编程条件”,这时,在步骤4.2中,我们已经将““置外部重编程请求=01”所以流程直接跳转到编程会话 BootLoad Session

步骤5,编程会话Programing Session 如何跳转到 默认会话

     

  

          步骤 5.1 编程会话状态下,发送 10 01指令、或复位指令(11 01 或 11 03 )、或 S3Service(一般设置为5000ms左右)超时,就会退出10 02 编程会话模式。和步骤4中进入10 02 编程会话相似。并不能直接跳!!

        步骤5.2 先“重设外部重编程标志”,这里更具体的解释:“将步骤4.2中的外部重编程标志位取反操作”,因为步骤4.2,将外部重编程标志=1,取反后=0。

       步骤5.3 然后执行重启操作,流程就跳转到最上面,初始化后“判断外部重编程请求”,步骤5.2中已经说明了,该标致位=00。

     步骤5.4 然后依次检查APP程序是否有效,判断APP有效后,延时20ms,延时时间>20ms后,才会进入 10 01 Default会话模式。

步骤6:如下图,这图中标注得2处,存在一个很特殊的点,也就是在2处,延时20ms时间中,如果此时接收到指令 10 03 就会立即进入BootLoad下的拓展会话模式。这一点也是特殊,至于为什么要这样设计暂时还不知道!!

步骤6中:总结,如果存在APP优先进入APP的默认会话,没有APP,才会进入Bootload的默认会话

 

 步骤7:0x11复位超时情况下,是如何再次进入10 01默认会话的。

如下图,不过图中并没有标识处APP模式中,通过0x11复位或超时,是如何返回默认会话的,我单独在图中标注了出来

 3、结合实例说明会话切换对各种不同服务的影响

状态转换 1(从默认会话到默认会话):

当控制器在默认会话模式下,测试设备请求启动默 认会话时,控制器应该完整的重新初始化默认会话。 在激活的会话期间,控制器应重置所有激活/启动/更改的设置/控制。这不包括编入非易失性存储器的长期变化

      实例解释1、如2F F0 01是控制大灯继电器闭合开启的指令,(假设2F服务在默认会话下,有效),此时如果我们再次执行 10 01 指令,或 11 01、1103复位指令。那2F指令将会无效,需要重新激活。

      实例解释2、这不包括编入非易失性存储器的长期变化这句话,又该怎么解释!如2E F1 90 这个指令,是写入车辆识别码。此信息是需要写入,非易失性存储器。只要写入成功后,复位或重新激活默认会话,也还是保持上一次写入的值。


状态转换 2(从默认会话到非默认会话):

当控制器从默认会话转换到非默认会话时,控制 器只应停止在默认会话期间通过 ResponseOnEvent(0x86)服务在控制器中配置的事件(类似 stopResponseOnEvent)。

      实例解释: 实际项目中,0x86服务其实很少见!也就是说,默认会话中执行的任何服务,在转换到非默认会话中,任然保持!!
状态转换 3(从非默认会话到非默认会话):

当控制器从非默认会话转换到非默认会话时(包括当前激活的诊断会话),控制器应(重新)初始化诊断会话,这意味着:
    (1)应该停止通过 ResponseOnEvent(0x86)服务在控制器中配置的每个事件。
    (2)安全性应重新锁定。 请注意,安全访问的锁定应将任何依赖于安全访问的激活诊断功能重置为未锁定状态(例如,激活 inputOutputControl 的一个 DID)。

     实例解释:如10 03 模式下的2E服务,是需要27 01/02解锁后,才能执行写入操作,这里注意一点(27 01/02 /03xxxxx)等服务都是没有失效限制的,"安全性重新锁定"的意思是,如果我们重新执行 10 03指令,此时如果想执行2E服务,就必须先执行27解锁服务。
    (3)应保持新会话中支持并且不依赖安全访问的所有其他激活的诊断功能。 例如,任何已配置的定期调度器在转换时都应保持激活状态从一个非默认会话到另一个或相同的非默认会话,并且不会影响 CommunicationControl(0x28)和 ControlDTCSetting(0x85)服务的状态。就像刷写过程中,10 03 会话中使用0x28服务和0x85服务。然后转到10 02会话时,这两个服务依然要保持激活!!
状态转换 4(从非默认会话到默认会话):

当控制器从默认会话以外的任何诊断会话转换 到默认会话时,控制器应通过 ResponseOnEvent(0x86)服务停止控制器中配置的每个事件, 并启用安全性。 任何其他在默认会话中不支持的诊断功能都将被终止。 例如,任何已配置的 周期性调度(0x2A)或输出控制(0x2F)应被禁用,并且 CommunicationControl 和 ControlDTCSetting 服务的 状态应被重置,这意味着正常通信在会话切换时,应重新启用默认会话。 在激活的会话期间, 控制器应重置所有激活/启动/更改的设置/控制。 这不包括编入非易失性存储器的长期变化。

### UDS诊断协议在网络层的实现与应用 UDS(Unified Diagnostic Services,统一诊断服务)是一种广泛应用于汽车系统的设备维护协议。它遵循多个国际标准,其中涉及网络层的主要包括 ISO-15765 和 ISO-14229 协议[^1]。 #### 1. 网络层的核心规范 ISO-15765 是专门针对网络层设计的标准,主要用于规定传输协议和服务机制。此协议定义了如何在 CAN 总线上进行消息传递以及数据分段处理的方式。具体来说: - **TP(Transport Protocol,传输协议)** 负责将较大的 PDU 数据拆分为较小的数据帧以便于发送,并在接收端重新组装这些数据帧。 - 它支持单帧模式和多帧模式两种通信形式,在多帧模式下需要额外的流量控制管理来协调数据流的速度。 #### 2. 数据封装过程 在一个典型的 UDS 请求中,PDU 的结构可以分解如下: \[ \text{A_PDU} = \text{A_PCI} + \text{A_Data} \] 这里 A_PCI 表示协议控制信息部分,而 A_Data 则包含了实际要传送的有效载荷数据[^3]。 当涉及到较大尺寸的消息时,由于物理总线带宽限制,通常采用 TP 进行分割操作后再逐片发出。这种技术确保即使超出单一报文长度上限也能顺利完成整个事务流程。 #### 3. 常见问题及其解决方案 尽管基于 ISO-15765 的实现提供了强大的基础框架,但在实践中仍可能出现一些挑战: ##### (a) 流量拥塞 如果 ECU 同时接收到过多请求,则可能导致缓冲区溢出从而引发丢包现象。为此引入 FC(Flow Control Frame),即流量控制帧用于调节上游节点发包速率以匹配下游能力。 ##### (b) 错误检测与恢复 为了增强可靠性,每当发生异常情况比如超时未响应或是非法参数等问题时,服务器应回复相应的 NRC (Negative Response Code)。这有助于客户端快速定位并修正潜在缺陷。 以下是利用 Python 编写的简单模拟程序片段展示如何构建基本的 UDS 查询命令序列: ```python import can def send_uds_request(bus, arbitration_id, service_id, data=[]): message = [ service_id, *data ] try: msg = can.Message(arbitration_id=arbitration_id, data=message, is_extended_id=False) bus.send(msg) print(f"Message sent on {bus.channel_info}") except Exception as e: print(e) if __name__ == "__main__": with can.interface.Bus(bustype='socketcan', channel='vcan0') as bus: # Example of sending a diagnostic session control request. send_uds_request(bus, 0x7DF, 0x10, [0x01]) ``` 上述代码展示了通过 SocketCAN 接口向虚拟 CAN 设备 vcan0 发送一条启动默认会话类型的指令实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值