UDS诊断会话控制(0x10)实战指南:从原理到状态机设计

别再死记硬背UDS服务了!深入解读0x10、0x27、0x22等核心服务的状态机与业务逻辑(附避坑指南) 本文深入解析UDS诊断协议中的核心服务(0x10、0x27、0x22),从状态机视角揭示其业务逻辑与实战陷阱。涵盖诊断会话控制、安全访问及DID读写等关键内容,提供工程实践建议和避坑指南,帮助开发者高效应对ECU开发中的诊断挑战。 阅读详情

1. 诊断会话控制(0x10)到底是什么?能用来干嘛?

如果你接触过汽车电子,尤其是ECU(电子控制单元)的开发或测试,那你大概率听说过UDS诊断。而在这个庞大的诊断协议家族里,诊断会话控制服务(Service 0x10) 绝对算得上是“守门人”和“大管家”。听起来有点玄乎?别急,我用大白话给你解释一下。

你可以把ECU想象成一个戒备森严的办公楼。平时,它只开放一个公共大厅(默认会话),访客(诊断仪)在这里只能进行一些基本的问询,比如看看大楼的灯亮不亮(读故障码0x19)、问问物业电话(读数据0x22)。但是,如果你想进入核心的研发实验室(编程会话)或者财务室(扩展诊断会话)去做更深入的操作,比如刷写新程序(0x31)、或者修改核心参数,那你就必须先在公共大厅的前台,出示特殊的通行证并申请进入特定区域——这个“申请进入特定区域”的动作,就是0x10服务干的事情。

所以,0x10服务的核心作用就两个:切换会话和管理会话状态。它决定了诊断仪接下来能在ECU上“干什么”以及“能干多久”。没有正确的会话,很多高级诊断服务都会对你亮起红灯(返回否定响应)。我在实际项目中就遇到过,测试同事抱怨刷写功能总是失败,一查日志,发现诊断仪压根没发0x10切到编程会话,直接在默认会话里发刷写请求,ECU当然会拒绝。理解0x10,是玩转UDS诊断的第一步。

2. 深入原理:会话、定时器与状态转换

知道了0x10是“守门人”,我们得搞清楚这个门卫的工作手册,也就是它的状态机。这是整个服务的灵魂,也是开发时最容易出bug的地方。

2.1 三种核心会话模式

UDS标准定义了多种会话,但最常用、最核心的是这三种:

  • 默认会话(Default Session, 0x01):ECU上电后的初始状态。功能受限,通常只支持读取信息、清除故障码等基础服务。功耗低,资源占用少。
  • 编程会话(Programming Session, 0x02):用于ECU软件刷写(Bootloader)。在此会话下,ECU会准备好内存、通信等资源,专用于接收和烧录新的程序数据。安全性要求最高。
  • 扩展诊断会话(Extended Diagnostic Session, 0x03):用于执行深度诊断、标定、输入输出控制等高级功能。比默认会话开放更多权限,但通常也需要通过安全访问(0x27) 服务解锁。

当你用诊断仪发送 10 02(切换到编程会话)时,ECU内部的状态机就开始运转了。

2.2 生命线:S3定时器与TesterPresent保活

这是实战中最关键的一个机制,我称之为“会话生命线”。想象一下,你申请进入了核心实验室(非默认会话),但门卫(ECU)有个规定:如果你进去后连续一段时间(比如5000ms)没有任何动静,门卫就会认为你已经离开,为了安全起见,他会自动把实验室锁上,并把所有人赶回公共大厅(默认会话)。

这个“连续一段时间”,就是 S3定时器(S3server)。它的值由整车厂定义,常见的有5000ms或10000ms。

那么,如何告诉门卫“我还在里面,别锁门”呢?有两个方法:

  1. 发送任何有效的诊断请求:比如你读个数据(0x22)、写个参数(0x2E),只要ECU处理了,就会重置S3定时器。
  2. 发送专门的“心跳”报文——TesterPresent(0x3E):如果你暂时没有其他操作,但又需要保持会话,就可以周期性地(比如每隔2000ms)发送 3E 00 这个服务。它本身不执行具体功能,唯一的作用就是告诉ECU:“我还活着,保持会话”。这就是 TesterPresent保活策略。

在代码里,这个逻辑必须清晰。我通常会在诊断任务主循环里维护一个S3定时器计数器,每次收到非0x3E的诊断请求,就重置它;收到0x3E请求,也重置它。同时,这个计数器会不断递减,一旦超时,立刻触发会话回退到默认会话的流程。

2.3 复杂的会话状态转换规则

会话切换不是简单的“开”和“关”,它伴随着一系列资源的清理与重置。标准文档里那几条状态转换规则(从默认到非默认、从非默认到另一个非默认等),看着头大,但我们可以结合实际场景来理解。

场景一:从编程会话切回扩展会话(非默认到非默认) 假设你刚刷完软件(在编程会话),现在想进行一些功能标定(需要扩展会话)。你发送 10 03。 这时ECU会做什么?

  1. 停止所有事件响应:如果之前用0x86服务配置了某些事件上报,现在全部停掉。
  2. 安全访问重新上锁:这是重中之重!编程会话可能拥有最高权限,但切换到扩展会话后,所有依赖于安全访问的功能(比如某些0x2E写操作)必须重新锁定,要求诊断仪重新走一遍“请求种子-发送密钥”的解锁流程。我踩过坑,有一次切换会话后安全状态没清干净,导致本该被拒绝的写操作意外成功,引发了数据错乱。
  3. 保持会话无关功能:比如你用0x28服务关闭了某些报文,或者用0x85关闭了DTC记录,这些状态通常会保留,因为它们不依赖于特定会话。

场景二:任何会话切回默认会话 无论是从扩展还是编程会话,只要切回默认会话(10 01或者S3超时),ECU就会进行一次“大扫除”:

  • 停止所有0x86事件。
  • 安全访问锁定。
  • 终止所有非默认会话支持的功能:比如你正在进行的周期性数据采集、对某个执行器的直接控制,都会被强制停止。通信控制(0x28)和DTC设置控制(0x85)的状态也会被重置,恢复正常通信。

把这些规则用代码实现,就是一个清晰的会话状态机。下面这个表格可以帮助你理清不同转换时的核心动作:

转换类型触发条件ECU核心动作
默认 -> 非默认收到 10 02 或 10 03停止默认会话下的0x86事件;初始化新会话资源;启动S3定时器。
非默认A -> 非默认B收到另一个10请求停止所有0x86事件;安全访问重新锁定;保持0x28/0x85等状态;重置S3定时器。
非默认 -> 默认收到 10 01 或 S3超时停止所有0x86事件;安全访问锁定;终止所有非默认会话功能;重置所有临时设置。
上电/复位 -> 默认ECU重启完整初始化,进入默认会话。但注意编程会话可能有特殊时间窗。

3. 实战代码设计:状态机与模块实现

理论懂了,不落地成代码就是纸上谈兵。我们来聊聊怎么在嵌入式C语言里实现它。我的经验是,一定要模块化,把会话控制当成一个独立的状态机模块来设计。

3.1 定义清晰的数据结构

首先,定义好会话类型和状态机上下文。别用一堆离散的全局变量,封装起来。

/* uds_session_control.h */
typedef enum {
    DEFAULT_SESSION = 0x01,
    PROGRAMMING_SESSION = 0x02,
    EXTENDED_DIAG_SESSION = 0x03,
    // ... 其他厂商自定义会话
} UDS_SessionType_t;

typedef struct {
    UDS_SessionType_t currentSession; // 当前会话
    uint32_t s3TimerCounter;          // S3定时器计数(单位ms)
    bool isSecurityUnlocked;          // 安全访问解锁状态
    // 其他与会话相关的状态标志,如0x28通信控制状态、0x85 DTC设置状态等
} UDS_SessionCtrlContext_t;

extern UDS_SessionCtrlContext_t gUdsSessionContext;

3.2 实现核心状态机函数

状态机的核心是一个处理函数,它根据收到的0x10请求子函数和当前状态,决定如何转换。

/* uds_session_control.c */
UDS_NegativeResponseCode_t UDS_HandleSessionControl(uint8_t subFunction) {
    UDS_SessionType_t requestedSession = (UDS_SessionType_t)subFunction;

    /* 1. 检查请求的会话是否被支持 */
    if (!IsSessionSupported(requestedSession)) {
        return NRC_SERVICE_NOT_SUPPORTED;
    }

    /* 2. 检查是否存在依赖条件(如编程会话可能要求车辆静止) */
    if (!CheckSessionDependencies(requestedSession)) {
        return NRC_CONDITIONS_NOT_CORRECT;
    }

    /* 3. 根据当前会话和请求会话,执行状态转换 */
    switch (gUdsSessionContext.currentSession) {
        case DEFAULT_SESSION:
            if (requestedSession != DEFAULT_SESSION) {
                // 转换2:默认 -> 非默认
                StopDefaultSessionEventHandlers(); // 停止默认会话的0x86事件
            }
            // 转换1:默认 -> 默认 (重新初始化)
            // 这里可以执行一些默认会话的清理工作
            break;

        case PROGRAMMING_SESSION:
        case EXTENDED_DIAG_SESSION:
            // 当前已在非默认会话
            if (requestedSession == DEFAULT_SESSION) {
                // 转换4:非默认 -> 默认
                TerminateNonDefaultSessionActivities(); // 终止所有非默认会话功能
                LockSecurityAccess(); // 安全上锁
            } else if (requestedSession != gUdsSessionContext.currentSession) {
                // 转换3:非默认A -> 非默认B
                ReLockSecurityAccess(); // 关键!安全重新锁定
                StopAllEventHandlers(); // 停止所有0x86事件
                // 注意:保持0x28, 0x85等状态
            }
            // 如果请求会话与当前相同,只需重置S3定时器
            break;

        default:
            break;
    }

    /* 4. 应用新会话 */
    gUdsSessionContext.currentSession = requestedSession;

    /* 5. 重置S3定时器 */
    ResetS3Timer();

    /* 6. 初始化新会话需要的资源 */
    InitSessionResources(requestedSession);

    /* 7. 发送肯定响应 */
    SendPositiveResponse(SID_SESSION_CONTROL, subFunction);
    return NRC_POSITIVE_RESPONSE;
}

3.3 定时器管理与保活机制

S3定时器的管理需要集成到系统时钟滴答(SysTick)中断或者一个高优先级任务中。

/* 在1ms的定时器中断服务程序或任务中调用 */
void UDS_SessionTimerManager_1ms(void) {
    if (gUdsSessionContext.currentSession != DEFAULT_SESSION) {
        if (gUdsSessionContext.s3TimerCounter > 0) {
            gUdsSessionContext.s3TimerCounter--;
            if (gUdsSessionContext.s3TimerCounter == 0) {
                // S3超时!强制回退到默认会话
                ForceSwitchToDefaultSession();
            }
        }
    }
}

/* 重置S3定时器,在收到任何诊断请求或TesterPresent时调用 */
void ResetS3Timer(void) {
    if (gUdsSessionContext.currentSession != DEFAULT_SESSION) {
        // S3时间从配置中读取,例如5000ms
        gUdsSessionContext.s3TimerCounter = GetS3TimeoutValue();
    }
}

/* 处理TesterPresent服务 */
UDS_NegativeResponseCode_t UDS_HandleTesterPresent(uint8_t subFunction) {
    // 子函数0x00(带响应)或0x80(无响应)
    ResetS3Timer(); // 核心就是重置定时器
    if (subFunction == 0x00) {
        SendPositiveResponse(SID_TESTER_PRESENT, 0x00);
    }
    // 0x80不需要响应
    return NRC_POSITIVE_RESPONSE;
}

4. 避坑指南与高级话题

在实际开发中,光是实现基本状态机还不够,有些“坑”需要提前留意。

4.1 安全访问(0x27)的联动处理

这是最容易出错的地方。务必记住:绝大多数会话转换都会导致安全访问锁定。特别是“非默认会话A切换到非默认会话B”,安全状态必须清零。你的安全访问模块和会话控制模块之间需要有清晰的接口。在会话状态机的转换动作中,一定要调用 Security_ForceLock() 这样的函数。

4.2 0x28与0x85服务的状态保持

与安全访问不同,通信控制(0x28)和DTC设置控制(0x85)服务的状态,在非默认会话之间切换时通常需要保持。这意味着你需要把这些状态存储在会话上下文结构体里,并且在会话初始化函数 InitSessionResources 中,不是简单地重置它们,而是根据存储的值来恢复通信开关或DTC记录使能状态。

4.3 编程会话的特殊时间窗

这是一个特殊规定:ECU在复位或上电后的一个很短时间(例如20ms)内,允许直接接收 10 02 进入编程会话,而不用先经过默认会话。这是为了满足产线端快速刷写的需求。实现时,可以在Bootloader的初始化阶段设置一个标志位 postResetWindow,并启动一个20ms的硬件定时器。在这个定时器超时前,诊断调度器应能处理 10 02 请求。超时后,则必须回到常规流程,先进入默认会话。

4.4 否定响应码的正确使用

不是所有 10 请求都会成功。你的代码要能处理各种异常情况并返回正确的NRC(否定响应码):

  • NRC_SUB_FUNCTION_NOT_SUPPORTED (0x12):请求的会话类型本ECU不支持。
  • NRC_CONDITIONS_NOT_CORRECT (0x22):条件不满足,比如车辆在行驶中请求编程会话。
  • NRC_REQUEST_SEQUENCE_ERROR (0x24):请求序列错误,但在这个服务里较少用。

实现好会话控制这个“大管家”,你的UDS诊断系统就打下了最坚实的基础。剩下的服务,很多都是在这个框架下添砖加瓦。刚开始可能会觉得状态转换绕来绕去,多画几次状态图,多写几个测试用例跑一跑,很快就能理顺。记住,清晰的模块划分和严谨的状态机逻辑,是写出稳定可靠诊断代码的关键。

6、UDS会话管理的“黑箱”揭秘——从状态机到实战攻防 摘要: 本文深入解析UDS协议会话管理机制,揭示ECU诊断会话的状态转换、安全访问流程及攻防实战。核心内容包括: 会话状态机:默认会话(0x10 01)、编程会话(0x10 03)的权限控制与超时规则; 安全访问(0x27服务):种子生成、密钥派生及防暴力破解设计; 攻防案例:会话劫持、密钥暴力破解的漏洞利用与防御方案(如CANoe白名单配置); 工具链实战:CANoe脚本监控会话状态、Python自动化渗透测试; 防御建议:双向认证、日志审计及超时重置机制。文末提供互动实验指南,助力理解会话管理安全。 阅读详情

相关推荐

别再死记硬背了!用一张图搞懂UDS诊断的10服务会话切换逻辑

本文通过状态机视角深入解析UDS诊断协议中的会话切换逻辑,重点剖析#10服务的权限体系、状态转换规则及实战应用。文章结合可视化方法和实验数据,揭示默认会话、扩展会话和编程会话的切换机制,帮助开发者高效掌握汽车电子诊断开发的核心技术。

weixin_30363509的博客 388

零基础入门 UDS 诊断|UDS-10服务完全指南:从原理到实战,一篇搞定诊断会话控制

📌 摘要: UDS-10服务(诊断会话控制)是汽车电子诊断的核心基础,掌握其机制是诊断工程师的必备技能。本文系统解析了UDS-10服务的原理、常见问题及实战技巧: 1️⃣ 技术原理 会话模式:默认会话(基础权限)、扩展会话(高级诊断)、编程会话(刷写固件)及OEM自定义会话。 关键机制:S3定时器(超时自动退回默认会话)、P2/P2*响应超时控制、会话切换状态机。 2️⃣ 典型问题 案例:BMS测试中因S3超时(5秒)导致读取DID失败,原因为脚本未发送TesterPresent保活报文。 排查:抓包分析

weixin_73209751的博客 355

UDS诊断会话控制(10服务)原理、状态机与工程实践详解

在汽车电子和嵌入式系统开发中,控制器局域网(CAN)总线上的统一诊断服务(UDS)协议是实现车辆电子控制单元(ECU)诊断、刷写和维护的核心标准。其核心原理在于通过一套标准化的服务请求与响应机制,实现工程师与车辆内部控制器之间的安全、可靠通信。这项技术的核心价值在于为汽车售后维修、产线测试和软件更新提供了统一的、标准化的交互接口,极大地提升了开发效率和维护便利性。其典型应用场景包括故障码读取、数据流监控、参数标定以及至关重要的ECU软件刷写(Bootloader)。本文聚焦于UDS协议中最为基础和关键的诊断

weixin_29196315的博客 298

UDS 0x10诊断会话控制服务测试:从原理到CANoe自动化实践

在汽车电子诊断领域,统一诊断服务(UDS)协议是车载控制器(ECU)与诊断仪通信的核心标准。其中,诊断会话控制服务(0x10)作为UDS协议的“模式开关”,通过管理ECU的不同工作状态(如默认会话、编程会话),实现了诊断功能的安全隔离与资源按需分配。其原理在于控制ECU内部诊断状态机的切换,直接影响后续诊断服务(如数据读写、刷写)的可用性。该机制的技术价值在于保障车辆诊断过程的安全性与可靠性,防止误操作,并优化ECU资源使用。在工程实践中,针对0x10服务的测试是验证整车诊断功能稳定性的关键,尤其在软件刷写

weixin_30920853的博客 347

图解说明UDS诊断协议会话控制状态机转换过程

深入解析UDS诊断协议中的会话控制机制,通过图示清晰展示状态机的转换逻辑与条件,帮助开发者理解不同会话模式间的切换过程,掌握uds诊断协议在实际通信中的行为特征。

weixin_42513870的博客 784

UDS 0x10诊断会话控制服务测试用例设计与CANoe自动化实现

在汽车电子与嵌入式开发领域,诊断协议是确保ECU(电子控制单元)可靠通信与功能安全的核心技术之一。UDS(统一诊断服务)协议作为行业标准,定义了车辆诊断通信的基础框架,其核心在于通过标准化的服务实现ECU状态的查询、控制与刷写。其中,诊断会话控制服务(如0x10服务)作为诊断状态机的“守门人”,管理着不同权限级别的会话切换,直接关系到后续诊断功能(如安全访问、数据读写)能否正常执行。其技术价值在于通过严谨的状态机与定时器管理,保障诊断操作在正确的安全上下文中进行,防止未授权访问与功能误触发。在工程实践中,针

weixin_34221073的博客 456

UDS诊断0x10会话控制详解:从CAN报文到超时机制

在车载诊断系统中,UDS(统一诊断服务)协议是ECU与诊断仪通信的核心标准,而0x10会话控制服务则是所有诊断流程的起点。它通过切换默认、编程、扩展三种会话模式,控制ECU的权限和运行状态,为后续安全访问、固件刷写、故障排查等操作奠定基础。理解0x10的报文结构、正负响应格式、S3超时与P2/P2*计时机制,是开发诊断工具和进行CANoe调试的关键。不同子功能对应不同场景:默认会话适合基础读取,扩展会话用于售后诊断,编程会话则是OTA升级和刷写的专属通道。掌握0x10的NRC错误码与保活策略,能有效避免会话

weixin_34208283的博客 294

通俗解释UDS诊断协议会话控制的工作原理

深入浅出地解析uds诊断协议中会话控制的工作原理,帮助理解ECU在不同通信状态下的切换逻辑与实际应用,掌握uds诊断协议的关键交互过程。

weixin_35578748的博客 798

UDS诊断协议会话控制模式切换:深度剖析与应用实例

深入讲解UDS诊断协议中会话控制(SID 10)的模式切换机制,涵盖默认会话、扩展会话、编程会话等状态转换逻辑与触发条件,并结合实际车载ECU通信案例说明如何正确发送请求、解析响应及处理NRC拒绝码,助力工程师快速掌握UDS诊断协议核心交互流程。

weixin_42160645的博客 665

基于CANoe的UDS诊断测试:从0x10服务用例设计到自动化实现

在汽车电子开发中,诊断功能是确保ECU软件质量、实现故障排查和在线刷写的核心环节。UDS(统一诊断服务)协议作为行业标准,定义了标准化的诊断服务框架,其核心在于通过服务请求与响应机制,实现ECU状态的精确控制和数据交互。理解UDS协议的原理,特别是其服务状态机、定时器机制和否定响应码(NRC)规范,是构建可靠诊断功能的基础。这项技术的工程价值在于,它能系统化地验证ECU在各种预设和异常条件下的行为,从而大幅提升软件鲁棒性、缩短问题排查时间,并确保生产刷写等关键流程的可靠性。在实际应用中,诊断测试广泛覆盖了从

weixin_33946605的博客 810

UDS诊断入门:0x10会话控制服务原理与实操详解

UDS(统一诊断服务)是汽车电子控制单元(ECU)通信的核心协议,而0x10会话控制服务则是整个诊断流程的入口。它通过默认、编程、扩展三种会话模式,实现诊断权限的最小化管控,为后续的0x19故障码读取、0x22数据读取、0x2E写入、0x31例程控制以及0x34/36/37刷写序列等操作奠定基础。理解0x10的报文格式、正负响应与NRC码,掌握S3超时机制和会话切换的时序要求,是诊断开发与测试的关键技能。本文从协议框架出发,结合PCAN等工具实操,深入解析0x10的工作逻辑与踩坑经验,帮助工程师快速建立UD

weixin_34082695的博客 586

UDS诊断会话控制0x10服务详解:CANoe与CAPL实操指南

在汽车电子开发与测试中,UDS(统一诊断服务)是ECU调试与刷写的核心协议。无论是Bootloader刷新、安全解锁还是故障诊断,诊断会话控制都扮演着门禁角色——不同会话模式决定了哪些服务可被访问。ISO 14229定义的0x10服务允许测试工具在默认、编程和扩展会话间切换,是所有诊断流程的前提。理解其报文结构、正负响应解析以及S3超时机制,能有效避免刷写失败与误判。在CANoe环境下,通过CDD或裸报文方式发送0x10请求,并结合CAPL脚本实现自动化会话切换,可极大提升回归测试效率。本文从工程实践出发,

weixin_34185512的博客 310

【UDS】ISO14229之0x10服务:诊断会话的切换逻辑与安全机制

本文深入解析UDS协议中的0x10服务(诊断会话控制),详细介绍了默认会话、扩展诊断会话和编程会话的切换逻辑与安全机制。通过实际案例和时序分析,阐述S3定时器、安全限制条件及P2时间参数等关键技术要点,帮助工程师有效解决会话切换失败等常见问题,并探讨厂商自定义会话的创新应用。

weixin_42533622的博客 436

UDS诊断中0x87链路控制服务:原理、应用与实战指南

在汽车电子诊断领域,通信协议是确保诊断仪与车辆ECU(电子控制单元)可靠交互的基础。UDS(统一诊断服务)作为核心协议,其底层通信链路的有效管理直接决定了数据传输的效率和稳定性。链路控制服务(如0x87服务)通过动态管理通信参数,特别是波特率切换,解决了多速率网络环境下的兼容性与效率问题。该技术允许诊断仪根据任务需求(如常规读取与高速刷写)灵活调整通信速率,从而优化能效并提升大数据传输的可靠性。在ECU软件刷写、大数据下载等高级诊断场景中,掌握链路控制原理与同步机制至关重要。本文聚焦UDS诊断中的通信链路管

weixin_34055787的博客 465

深入解析整车诊断DID服务:0x22读取、0x2E写入与0x2F控制实战指南

本文深入解析整车诊断中的核心DID服务:0x22读取、0x2E写入与0x2F控制。通过实战指南,详细阐述了各服务的报文格式、交互流程、常见应用场景及关键注意事项,帮助工程师掌握与汽车ECU深度对话、进行参数配置与功能控制的关键技术。

c6d7e8f9g的博客 983

基于UDS诊断协议的会话管理实战案例解析

深入剖析UDS诊断协议在实际项目中的应用,重点讲解会话管理的状态切换与服务响应机制,结合真实场景帮助理解uds诊断协议的核心逻辑与常见问题处理。

weixin_27645199的博客 836

汽车ECU诊断会话控制:10服务(0x10)从入门到实战,手把手教你玩转UDS诊断

本文深入解析汽车ECU诊断会话控制中的10服务(0x10),从UDS协议基础到实战应用全面覆盖。通过CANoe、PCAN-Explorer等工具演示默认会话、编程会话和扩展会话的切换流程,详细讲解报文构造、定时参数设置及常见错误排查技巧,帮助工程师快速掌握汽车电子诊断核心技术。

weixin_32025789的博客 232

CAPL脚本处理UDS NRC 0x78响应:实现诊断会话的可靠等待机制

在汽车电子诊断领域,UDS(统一诊断服务)协议是ECU(电子控制单元)通信的核心标准。其定义了诊断请求与响应的交互机制,其中NRC(否定响应码)用于指示请求处理状态。NRC 0x78(响应待定)是一种特殊状态码,表明ECU已接收请求但需要时间处理,测试端需维持会话并等待最终响应。这一机制要求测试脚本具备异步事件处理和状态管理能力,以确保诊断流程的可靠性。在Vector CANoe/CANalyzer工具中,CAPL(CAN Access Programming Language)是实现自动化诊断测试的关键。

weixin_33724659的博客 620
上一篇: 67. CopyOnWriteArrayList 在事件监听器管理中的高效应用
下一篇: Cox回归亚组分析中交互效应可视化:三种方法的实战对比
ggg99
博客等级 码龄19年 49粉丝 1526原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值