
UDS 的请求/响应模型本质上是“客户端-服务器”模型诊断仪是客户端ECU 是服务器客户端发请求服务器检查条件后返回肯定响应或否定响应。1. 请求/响应模型怎么理解诊断仪发送一条请求报文格式通常是SID 子功能/参数ECU 收到后只会给出三种结果结果报文格式含义肯定响应SID 0x40 参数服务执行成功例如请求0x22 F1 90响应0x62 F1 90 ...否定响应0x7F SID NRC服务执行失败例如0x7F 22 31表示请求超出范围响应待定0x7F SID 0x78ECU 还在处理稍后给出最终响应举个例子读取 DID 的典型过程是诊断仪 → ECU02 22 F1 90 ECU → 诊断仪05 62 F1 90 01 02如果 ECU 不支持这个 DIDECU → 诊断仪03 7F 22 31所以看 CANoe Trace 时可以按这个顺序判断有没有请求 → 有没有肯定响应 → 有没有 0x7F 否定响应 → 有没有 0x78 等待响应。2. 物理寻址一对一物理寻址是诊断仪和某一个具体 ECU通信。比如诊断仪 → ECUCAN ID 0x7E0 ECU → 诊断仪CAN ID 0x7E8特点1:1 通信只有目标 ECU 响应支持所有 UDS 服务包括 0x27 安全访问、0x2E 写 DID、0x31 例程控制、0x34/0x36/0x37 刷写支持单帧和多帧传输物理寻址下所有错误都必须回复否定响应如果请求报文里抑制肯定响应位为 1ECU 可以不回肯定响应但否定响应仍然要回。日常做 UDS 测试、读 DTC、刷写、写 DID、进扩展会话基本都走物理寻址。3. 功能寻址一对多功能寻址是诊断仪向一组 ECU广播请求。比如 CAN 上常见的功能地址诊断仪 → 所有 ECUCAN ID 0x7DF特点1:N 广播多个 ECU 都能收到通常只支持单帧不适合长报文只支持部分服务常见如 0x10、0x11、0x22、0x28、0x3E、0x85、0x14、0x19禁止用于写入、修改、控制类服务例如 0x27、0x2E、0x31、0x34如果 ECU 不支持该服务或子功能通常不回复否定响应避免总线拥塞。比如用功能寻址发0x7DF → 02 10 01所有支持 0x10 01 的 ECU 都会收到并各自处理。但多个 ECU 如果同时回复就可能在 CAN 总线上产生冲突所以功能寻址通常只用于“大家都能静默执行”或“响应不会撞车”的场景。4. 关键区别维度物理寻址功能寻址通信模式1:1 点对点1:N 广播典型 CAN ID0x7E0/0x7E8 等0x7DF 等响应方只有目标 ECU多个 ECU 可能响应支持服务全部 UDS 服务仅部分只读/控制类服务多帧传输支持通常不支持NRC 响应所有错误都要回不支持类 NRC 通常不回典型场景刷写、读 DTC、写 DID、0x27 解锁批量清 DTC、保活 0x3E、通信控制 0x285. 在 CANoe 里怎么判断看 Trace 时可以先看 CAN ID如果请求发到0x7E0、0x7E1、0x7xx这类单个 ECU 地址通常是物理寻址如果请求发到0x7DF通常是功能寻址如果一条请求后出现多个不同 ECU 的响应大概率是功能寻址如果请求后只有唯一 ECU 回复且包含 0x27、0x2E、0x34 等服务一定是物理寻址。一句话概括物理寻址是“私聊”功能寻址是“群发”私聊必须回群发看规则写操作只能私聊读状态和批量控制可以群发。