ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深度解析SAE J2819(CAN TP2.0)报文格式与诊断连接流程

深度解析SAE J2819(CAN TP2.0)报文格式与诊断连接流程 说实话我第一次在售后文档里看到 SAE J2819 这个编号时第一反应是去翻标准库结果翻了半天也没找到一份像 ISO 14229 那样能直接下载的全文。后来做大众奥迪诊断工具的通讯适配实测抓了几百条报文才彻底搞明白在诊断圈里提起 SAE J2819基本默认指的就是大众奥迪这套 CAN TP2.0 通信协议规范本身。它解决的是很具体的问题——诊断仪和 ECU 之间怎么可靠地拆包、组包、建立会话、按服务收发数据。这篇文章我就把手上的资料和实践经验整理出来把 SAE J2819CAN TP2.0的报文格式和连接流程掰开揉碎讲一遍适合想自己诊断大众奥迪车辆、或者正在写第三方诊断工具适配层的朋友参考。1. 先把概念捋清楚SAE J2819 和 CAN TP2.0 到底是什么1.1 一套规范两个叫法大众奥迪的诊断体系里协议栈经历了两代比较大的变化。早期车型大量使用 KWP2000ISO 14230对应的传输层实现叫 TP1.6特点是基于 K 线、关键字握手、传输层帧格式相对简单。后来电子电气架构越来越复杂网关Gateway成了所有总线的交汇点诊断仪要访问的不再是发动机或变速箱这种单个 ECU而是分布在动力总线、舒适总线、信息娱乐总线上的几十个控制器这时候老一套就不够用了。TP2.0 就是在这个背景下出现的传输层协议全称常见于各类非公开维修资料里代号就是 CAN TP2.0。SAE J2819 这个名字在坊间流传很广很多人把它当作 TP2.0 的正式标准号来引用。严格来说它更像是一套由 OEM 诊断规范衍生出来、被第三方工具开发者普遍遵循的协议约定包含帧格式、寻址规则、时间参数和连接流程。你不用纠结编号本身只要记住一件事凡是说“支持大众奥迪高版本诊断”的工具底层跑的几乎都是这套 TP2.0。1.2 为什么大众奥迪要单独搞一套 TP2.0直接原因有三个。第一是数量现代大众奥迪车上的控制单元动辄几十个靠传统点到点的 K 线诊断根本拉不过来必须依赖网关做路由把诊断请求转发到对应总线上的目标 ECU。第二是速度K 线波特率通常只有 10.4 kbps读一个大块数据能等得人发毛CAN 总线 500 kbps 起步效率完全不是一个量级。第三是标准化OBD 法规要求排放相关诊断走 ISO 15765DoCAN这套标准大众奥迪干脆把自家诊断也往 CAN 上迁移并基于 ISO 15765-2 做了一版自己的传输层定制这就是 TP2.0 的雏形。所以你可以把 TP2.0 理解为“大众奥迪化的 ISO-TP”。帧格式层面它和 ISO 15765-2 高度兼容单帧、首帧、连续帧、流控帧这四个基本概念完全一致差异主要体现在寻址策略、时间参数、以及和上层 UDS 服务配合的会话管理流程上。理解这一点非常关键你不需要把 TP2.0 当成一个全新的外星协议它就是在标准 CAN 传输层基础上套了一层 OEM 的规则。1.3 和 ISO 15765-2、UDS 怎么分工要把协议分层搞清楚。最底下一层是 CAN 物理层和数据链路层负责把报文变成电信号发到总线上这一层由 CAN 收发器和控制器完成。往上一层是传输层也就是 TP2.0 的核心职责当应用层要发一段超过 CAN 单帧容量上限的数据时传输层负责分段发送、接收端负责重组同时处理流控、超时、错误恢复。再往上是应用层也就是 UDSISO 14229定义的是 0x10 诊断会话控制、0x22 按标识符读数据、0x19 读故障码这类真正的“业务逻辑”。我用一个类比说明CAN 帧是货运车厢一次只能装 8 个字节的货物TP2.0 是货运站的装卸和调度规则货物多了就拆成多节车厢发到站再按顺序拼回去UDS 则是随车附带的货物清单和提货单告诉收货人这一趟运的到底是什么货。你抓包看到的每一帧 CAN 报文其实都是这三层协作的结果解析时要逐层剥开看。2. 报文拆解从 CAN 帧里认出 TP2.0 的四种帧2.1 先回到 CAN 本身一帧报文长什么样不管上层协议多复杂最终在总线上跑的仍然是标准 CAN 帧。大众奥迪诊断 CAN 绝大多数是 500 kbps使用标准帧格式也就是 11 位标识符CAN ID数据场最长 8 字节。CAN 帧里除了 ID 和数据还有 DLC数据长度、CRC 校验、ACK 应答等区域这些由 CAN 控制器硬件自动处理软件层一般只关心 ID 和数据场。做过 RS232 串口协议报文解析的朋友应该能秒懂一个道理串口帧里每个字符前后有起始位和停止位接收方靠它们找到字符边界CAN 帧里的 ID 和 CRC 就是每帧的边界和签名ID 告诉接收方“这帧是发给谁的、从哪来的”CRC 保证数据在总线上传输时没有被干扰篡改。你如果连 CAN 帧的 ID 都看不懂后面解析 TP2.0 就是空中楼阁所以第一步永远是先学会看原始 CAN 报文。2.2 寻址方式物理寻址和功能寻址怎么分配 IDTP2.0 的寻址分两种。物理寻址是点对点诊断仪给某个特定的 ECU 发请求请求 ID 和响应 ID 一一对应功能寻址是广播诊断仪用同一个 ID 发给总线上所有 ECU所有支持该服务的 ECU 都要响应。在 11 位标准 ID 体系里最典型的物理寻址是请求 ID 0x7E0 对应响应 ID 0x7E80x7E1 对 0x7E9以此类推功能寻址最常用的是 0x7DFOBD 模式下所有 ECU 都要听。但大众奥迪的实际场景比这个复杂因为绝大多数 ECU 挂在网关后面的分总线上诊断仪直接对着 0x7E0 发请求收到的可能是网关的响应而不是目标 ECU 的响应。TP2.0 的做法是通过网关路由诊断仪先把请求发给网关或者功能寻址让网关接管网关根据请求里的目标地址把报文转发到对应的总线上。所以抓包时你会看到请求先出现在诊断总线紧接着网关转发帧又出现在动力总线或舒适总线上两个总线里的相同服务报文 ID 可能不一样。这也是大众奥迪诊断“连接流程”特别讲究的一个点先要建立和网关的通信再由网关去“联系”目标 ECU。另外注意部分车型、部分控制单元会使用 29 位扩展 ID。标准 ISO-TP 在扩展 ID 下有一套固定的寻址规则比如 0x18DAxxF1 这种格式前 16 位里藏着源地址和目标地址。遇到这种报文你的滤波器一定要打开扩展帧选项否则 ID 对不上响应直接被过滤掉看起来就像“车没反应”。2.3 PCI 字节SF、FF、CF、FC 四种帧怎么区分这是 TP2.0 报文拆解的核心。CAN 数据场的第一个字节叫协议控制信息PCI它决定了这一帧属于四种类型里的哪一种也携带了长度、序号、流控参数等信息。四种帧的字节结构和含义如下单帧SFPCI 高四位是 0低四位表示数据长度0 到 7。处理时先看这个长度再从数据场第 2 个字节开始取对应长度的字节作为有效载荷。首帧FFPCI 高四位是 1低四位和第二个字节组成一个 12 位的总长度字段表示这次多帧传输总共有多少字节。FF 数据场前 2 个字节被 PCI 占用所以最多携带 6 个有效数据字节。连续帧CFPCI 高四位是 2低四位是帧序号SN从 1 开始计数每发一帧加 1超过 15 就回绕到 0 重新计数。CF 数据场前 1 个字节是 PCI剩下 7 个字节全是有效载荷。流控帧FCPCI 高四位是 3低四位是流控状态0 表示允许发送1 表示等待2 表示溢出。FC 的第二个字节是块大小 BS第三个字节是最小间隔时间 STmin。我在表格里把四种帧的 PCI 格式整理了一下方便对照帧类型PCI 首字节长度/参数有效载荷容量CAN DLC8典型用途单帧 SF0x0nn载荷长度0-77 字节短请求、短响应首帧 FF0x1HH第二字节组成 12 位总长度6 字节多帧传输的第一帧连续帧 CF0x2nn帧序号 SN0-15 循环7 字节多帧传输的后续帧流控帧 FC0x3ss流控状态0/1/2后跟 BS、STmin无载荷多帧发送方向控制2.4 一个单帧请求的完整拆解光看表格不好建立感觉直接上一条真实抓到的报文。假设诊断仪向发动机 ECU 发送“进入扩展诊断会话”这条 UDS 服务ID: 0x7E0 DLC: 8 Data: 02 10 03 00 00 00 00 00拆解过程如下。第一个字节 0x02高四位是 0所以这是单帧低四位 0x02 表示有效载荷长度为 2。那么从第二个字节开始取 2 个字节得到 0x10 0x03。对照 UDS 服务表0x10 是 DiagnosticSessionControl诊断会话控制子功能 0x03 表示扩展诊断会话。后面的 0x00 都是填充字节没有实际含义。ECU 的响应长这样ID: 0x7E8 DLC: 8 Data: 06 50 03 00 32 01 F4 00同样先看 PCI 0x06单帧、长度 6。有效载荷是 0x50 0x03 0x00 0x32 0x01 0xF4。0x50 是 0x10 加上 0x40 的响应位表示肯定响应0x03 表示当前会话已经被切换。后面 4 个字节是两组时间参数P2 定时是 0x003250 毫秒P2* 定时是 0x01F4500 毫秒。这两个参数非常重要它告诉诊断仪普通服务要在 50 毫秒内响应如果超过 50 毫秒没响应诊断仪应该按 P2* 的 500 毫秒继续等。很多自制工具出现“莫名其妙的超时”就是因为完全无视了响应里带回的时间参数。3. 连接流程手把手走一遍从插头到建立会话3.1 物理连接OBD 接口与诊断 CAN 引脚先解决最基础的问题拿什么线、插哪个孔。大众奥迪的 OBD 诊断座是标准 16 针接口但真正干活用的引脚不多。pin 16 是常电正极pin 4 和 pin 5 分别是底盘地和信号地pin 6 是 CAN 高CAN_Hpin 14 是 CAN 低CAN_L。你把诊断仪插上去仪器就是靠 pin 16 取电靠 pin 6/14 收发 500 kbps 的诊断 CAN 信号。就有个很多人容易忽略的坑大众奥迪车上往往不止一路 CANOBD 座上的 6/14 只是接入了主诊断 CAN通常挂在网关的诊断端口上你通过这路 CAN 能“看到”的报文只有网关愿意往诊断端口上转发的那部分。换句话说你在主诊断 CAN 上抓到的报文其实是网关做了策略过滤和路由之后的子集不是全车总线的完整流量。理解这一点你就不会再问“为什么我抓不到舒适总线上某条报文”这种问题了。3.2 第一步波特率、终端电阻和总线扫描物理连接搞定后第一件要做的事是把工具波特率设到 500 kbps。绝大多数大众奥迪诊断 CAN 是 500 k但也有少数老车型或特殊总线用 125 k、100 k所以工具最好支持自动检测或者至少能把尝试的波特率列表配全。波特率确认后开始总线扫描。扫描的目的有几个确认总线上有 ECU 在线、拿到目标 ECU 的诊断 ID、以及搞清楚当前车辆支持的诊断协议版本。正规的做法是先对网关做物理寻址比如请求 ID 0x7E0 或者网关自己的诊断 ID发给网关一条读取 VIN 或者读取软件版本的服务看网关是否响应。网关响应正常再让网关做节点扫描诊断仪发功能寻址请求或者挨个轮询候选诊断 ID0x7E0 到 0x7E7、0x6F1 到 0x6F7 这一批能从哪些 ID 收到响应就说明哪些 ECU 在线。这里要给动手党一个建议扫描时最好把你抓包工具的 ID 过滤器全部关掉让所有报文都进来看。因为你不知道这个车型的网关会把哪个 ECU 映射到哪个 ID 上预置过滤条件很容易把关键响应漏掉。我见过不少人用默认过滤器只收 0x7E8结果网关把目标 ECU 的响应 ID 映射成了 0x6F9工具“啥都没收到”实际上是过滤器把人家的应答全扔了。3.3 第二步进入诊断会话0x10扫描确认 ECU 在线以后下一个动作是建立诊断会话。UDS 里最常见的三个会话是默认会话0x01、编程会话0x02、扩展诊断会话0x03。默认会话上电就能用但很多服务被禁用扩展会话开放的服务最多适合读数据、做匹配、执行例程编程会话主要是刷写引导用的通信时序要求更苛刻。以扩展会话为例请求是ID: 0x7E0 Data: 02 10 03 00 00 00 00 00这里再强调一次不要一上来就发 0x10 03。有些 ECU 对会话切换有前置条件比如必须先从默认会话收到 0x3ETesterPresent保持在线或者必须先做安全访问才能切到某个会话。更稳妥的做法是先用 0x10 01 切到默认会话确认链路通再切 0x10 03。链路不通的时候先别急着怀疑协议先把 0x3E 这种“心跳”报文周期性地发着一般 2 到 3 秒一次很多 ECU 有通讯超时保护超过 5 秒没收到任何诊断帧就自动回默认会话。3.4 第三步需要时做安全访问0x27扩展会话不等于所有服务都开放。凡是涉及写入、编码、匹配的服务几乎都要求先做安全访问也就是 UDS 的 0x27 服务。流程分四步请求种子、ECU 返回种子、计算密钥、发送密钥。以安全级别 01/02 为例标准流程是诊断仪 - ECU: 02 27 01 00 00 00 00 00 (请求种子级别 0x01) ECU - 诊断仪: 06 67 01 xx xx xx xx 00 (响应返回 4 字节种子) 诊断仪 - ECU: 06 27 02 kk kk kk kk 00 (发送根据种子算出的密钥级别 0x02) ECU - 诊断仪: 02 67 02 00 00 00 00 00 (肯定响应安全访问通过)关键点在于密钥算法。不同车型、不同 ECU 的算法差异很大有的是查表有的是对种子做多项式变换有的是跟车型 VIN 绑定。这个算法属于厂商的授权数据正规的工具VCDS、ODIS都内置了合法的授权算法个人开发者很难自己逆向出来。这里我不展开任何具体算法也不建议任何人去尝试绕过或者暴力破解因为安全访问本身是防盗和防误操作机制强行绕过不仅法律上有风险更有可能把 ECU 锁死。你只需要理解协议流程知道什么时候会走到这一步就够了。实际操作中要特别注意安全访问的次数限制。ECU 会记录连续失败的次数失败达到上限后会返回 0x36尝试次数超限或者 0x37需要延时这时候哪怕你密钥算对了也过不去必须断电等一会儿才能重新试。所以我在自用车上测试时都会先把密钥计算工具单独验证一遍确认无误再接车避免白等。3.5 多帧传输一个大响应是怎么被组装回去的会话建立之后最常见的操作是读数据。比如读 VIN用 0x22 服务加 DID 0xF190请求本身很短一个单帧就发完了ID: 0x7E0 Data: 03 22 F1 90 00 00 00 00但响应就没这么简单了VIN 是 17 个 ASCII 字符加上服务号、DID、数据长度控制字段有效载荷一共超过 7 字节单帧装不下必须走多帧。ECU 发出来的原始报文会长这样ID: 0x7E8 Data: 10 14 62 F1 90 31 46 41 (首帧总长度 0x14 20 字节) ID: 0x7E8 Data: 30 00 14 00 00 00 00 00 (流控帧允许发送BS0STmin20ms) ID: 0x7E8 Data: 21 57 56 5A 5A 5A 5A 5A (连续帧 SN1) ID: 0x7E8 Data: 22 5A 5A 5A 5A 5A 5A 5A (连续帧 SN2)组装过程是这样的先收 FF从第 1、2 字节解析出总长度是 20FF 数据场第 3 到第 8 字节取出 6 个有效字节也就是 62 F1 90 31 46 41。随后收到 FC说明 ECU 愿意继续发。接下来按 SN 顺序收 CF每个 CF 的后面 7 个字节依次拼接CF1 的 7 个字节CF2 的 7 个字节。把所有有效字节拼起来正好 20 字节62 F1 90 17 字节 VIN。最后照着 UDS 的响应格式拆0x62 是 0x22 的肯定响应0xF190 是 DID后面就是 VIN 字符。这里必须提醒一个容易翻车的地方连续帧的序号 SN 是 4 位的到 15 之后回绕到 0。如果你的重组代码没有处理回绕发送方连续发超过 16 个 CF 时接收端在某个 CF 之后会把 SN 判断成“重复帧”或者“乱序帧”直接丢弃整个多帧传输就断了。大众奥迪传大块数据和诊断快照时多帧场景非常常见写解析器务必把 SN 回绕考虑进去。4. 实战抓包工具选择与完整流程验证4.1 工具怎么选自己动手诊断工具选型决定了你后面是轻松还是痛苦。我把用过的主流方案整理成表格工具类型优点缺点适合场景VCDS含副厂线诊断软件线大众奥迪专用扫描快、功能集成度高侧重应用层底层报文不透明日常诊断、读码、基础匹配ODIS VAS 硬件官方诊断系统全功能、数据全、跟随 OEM 更新授权贵、硬件贵、流程繁琐正规维修厂、深度诊断PCAN-USB PCAN-View通用 CAN 分析工具原始报文可见过滤器、触发、日志都强需要自己懂协议无应用层解析协议学习、抓包分析CANable Wireshark低成本抓包方案价格便宜配合 ncalayer 能直接进 Wireshark驱动和稳定性看固件投入时间多学习、自用抓包逻辑分析仪/示波器物理层工具能看到波形、电平、位时序解析效率低、不适合日常诊断排查物理层故障我的建议是两套配合日常修车用一个成熟的诊断软件省时间想真正搞懂 TP2.0必须上一套能看原始 CAN 报文的工具PCAN 或者 CANable 都行。很多问题比如“这个车型的网关到底把请求路由到哪个 ID”你用商业软件永远看不到答案只有抓原始报文才一目了然。4.2 抓包前必须确认的三件事第一是波特率错了啥也收不到。第二是终端电阻诊断工具接上车辆总线时车辆本身一般已经有 60 欧姆左右的终端电阻如果你的工具或者延长线又并联了一组 120 欧姆总线负载会被拉低波形畸变、丢帧、错误帧都会冒出来。稳妥的做法是抓包工具不带终端电阻纯监听模式。第三是记录格式PCAN-View、CANalyzer、Wireshark 的日志格式互不通用建议统一导出成 CSV 或者 ASC 这类通用格式后续写脚本处理方便。实际抓包时我会把过滤器配置成一个“先全收、后过滤”的策略。第一次抓包绝对不开任何 ID 过滤全量记录 5 到 10 分钟里面包含总线扫描、会话切换、正常诊断服务甚至还有网关自己的一些保活报文。先把全量数据存下来再在软件里按 ID 分组、按服务分类这样既能看清整体流程又不会漏掉意外出现的报文。4.3 把 TP2.0 抓包结果和网络协议分析对照看学 CAN 协议的人很多都有网络基础这套迁移思维特别管用。以前我在 GNS3 里搭两台路由器分别接主机分析 IP 数据报文转发和 ARP 协议的时候最核心的步骤就是先抓 ARP 广播确认“谁是谁的 MAC 地址”再抓 IP 转发路径看路由器怎么把包从入口转到出口。用这个思路看 TP2.0 会豁然开朗总线扫描就相当于 ARP 广播目的是发现总线上有哪些节点、每个节点的“地址”诊断 ID是什么网关路由就相当于 IP 转发诊断仪发出的请求先到网关这个“路由器”再根据目标地址被转发到对应 ECU 所在的总线ECU 的响应再原路返回就像回程 IP 包一样。RS232 串口协议报文解析的类比也很直接。做串口解析时你先要根据帧头、长度字段、校验字节把一条完整的报文从字节流里切出来再对帧体做业务解析。CAN 抓包也是一模一样的流程先把原始数据场按 PCI 字节切成“一帧完整的 TP2.0 消息”单帧就是一条多帧要按 SN 拼完再去解析 UDS 服务。你甚至可以串口上那套“先定边界、再验校验、最后查业务表”的三步法直接搬过来唯一区别是 CAN 的帧边界已经由硬件确定好了你要做的更多是把多帧聚合成消息。4.4 关键时间参数速查表TP2.0 的时序是很多人忽略的隐形杀手。几千行代码逻辑都对就是跑不通往往栽在一个超时参数上。我把常用的时间参数整理成一张速查表参数含义典型值大众奥迪常见备注P2ECU 响应普通服务的最大时间25-50 ms由 ECU 在会话切换响应里下发P2*ECU 响应复杂服务的最大时间500-5000 ms超时前诊断仪必须等待STmin连续帧最小间隔0-127 ms0xF1-0xF9 为微妙级发送方必须遵守BS块大小连续帧数量限额0 表示不限收满 BS 个 CF 后才需要重新发 FCN_As/N_Ar发送方允许的发送超时约 1000 ms超过说明总线或节点异常N_Bs等待流控帧的超时约 1000 ms发完 FF 后等不到 FC 就超时N_Cr等待连续帧的超时约 1000 ms中间丢一个 CF 就整个多帧失败重点说一下怎么用 P2/P2* 优化你的诊断工具。会话切换响应带回来的 P2/P2*是 ECU 对“当前会话下所有服务”的时间承诺。你在扩展会话里发 0x22 读数据如果 50 毫秒内没收到响应不能立刻报超时要放宽到 500 毫秒再报。有些 ECU 在执行例程或者写数据时P2* 会给到 5 秒以上你要是按固定 200 毫秒超时去卡工具就永远“连不上”。所以比较成熟的做法是每次收到会话切换响应后动态更新全局超时参数而不是写死在配置里。5. 常见问题与排查经验5.1 完全连不上工具显示无响应先排除物理层。检查 OBD 针脚有没有缩针、弯针pin 6 和 pin 14 是否导通pin 16 有没有 12V 电压。然后用示波器或者 CAN 分析仪总线统计功能看错误帧计数如果错误帧在疯狂增长说明 CAN_H/CAN_L 接反了或者波特率不匹配又或者总线终端电阻异常。我碰到过一个很典型的案例工具能收到零零星星的报文但无法正常通讯最后发现是延长线里的 CAN_H 线断了接触不良导致大量位错误。物理层正常后再查逻辑层。逐一确认波特率是不是 500 kID 过滤有没有挡掉响应帧目标 ECU 是不是真的在诊断总线上还是挂在内网、需要网关路由车辆是否处于休眠状态。大众奥迪的网关会在一段时间无操作后进入休眠导致诊断端口也“沉默”。解决办法是工具上电后先发一条 0x3E 或者功能寻址请求把总线唤醒等几秒再继续扫描。5.2 请求发出去了但收不到响应这种情况优先怀疑寻址或者会话状态。你的请求如果是功能寻址比如 0x7DF有些 ECU 出于安全策略不会回复非 OBD 类服务这属于正常现象。如果用的是物理寻址先确认目标 ID 是不是当前车型网关映射出来的“真实响应 ID”因为网关转发机制可能导致响应 ID 和标准 0x7E8 对不上你只监听 0x7E8 自然收不到。另外排查一下会话状态ECU 是不是因为超时自动退回默认会话了如果默认会话下你发的服务被禁用ECU 会直接不回包或者返回否定响应 0x31请求超出范围。遇到这种情况流程应该是重新切 0x10 03再重发原服务。5.3 多帧传输发到一半就卡住多帧卡死是 TP2.0 里最常见的疑难杂症。现象是 FF 能收到FC 也发了但后续 CF 收不全或者重组后数据对不上。排查顺序如下。先看流控帧的 BS 和 STmin 设置是否合理。如果你发的 FC 里 BS0意味着允许对方一口气发完所有 CF这时对方如果按 STmin0 狂发你接收端处理不过来就会丢帧。稳妥的做法是 BS 设成 1 或者 2每收一小批就重新评估一次虽然慢一点但稳定。再看 SN 序列是否连续中间有没有缺口如果有缺口大概率是丢帧了这时候要看总线上是不是有别的报文在抢占仲裁导致连续帧被滞后或者你的接收缓冲区满了。最后检查 N_Cr 超时设置如果超时设置比对方 STmin 还短接收端会在合法的时间间隔内提前超时导致重组失败。这里分享一个抓包排查的小技巧当你怀疑多帧问题别只盯着 ID 里的诊断报文看先看看总线上同一时间有没有高优先级报文在刷屏。我遇到过一辆车某个模块的周期报文每 10 毫秒发一次把诊断 CF 的发送时机挤得七零八落接收端重组频繁超时。后来把总线负载率降下来诊断通讯立刻恢复正常。5.4 安全访问或者服务执行被拒绝ECU 返回否定响应码时一定要养成先查 NRC 再怀疑协议的习惯。0x31 通常是服务在当前会话下不可用先把会话切到 0x10 03 再试0x33 表示安全访问被拒检查是不是没做 0x27 或者级别不对0x36 是尝试次数超限马上停止重试断电等待复位0x37 表示请求被延迟过一会儿再试。还有一个容易被忽略的点某些写入类服务不仅要求安全访问还要求先禁用故障码存储或者先进入特定的编程模式顺序错了也会被拒。在自用车上执行这一类流程时我的原则是“先读后写、先备份再动”。连接流程里凡是涉及写操作、编码、匹配的环节动手之前一定先通过 0x22 读一遍原始值截图存档。出了任何问题至少能把原始参数写回去。6. 关于 TP2.0 的最后一点补充再说一个容易被新手误判的点TP2.0 并不等于 UDS也不等于 CAN 物理层它只是中间那个负责“把应用层数据搬上总线”的传输层。你在网上看到很多“大众奥迪诊断报文”的截图里面既有 0x10、0x22 这种 UDS 服务也有 0x7E0、0x7E8 这种 CAN ID还有各种时间参数这些其实是三层信息混在一起。拆解的时候如果混为一谈很容易被绕晕。我的习惯是先把每帧 CAN 报文按 ID 和数据场拆开再把数据场里第一条消息按 PCI 分成单帧还是多帧最后才看有效载荷里的 UDS 服务和子功能。一层一层剥永远不出错。另外懂原理之后再看市面上的大众奥迪诊断工具你基本就能判断它的水平了。很多廉价工具只是用现成协议库暴力适配遇到老车型或者冷门控制单元就抓瞎而好的工具必然对 TP2.0 的寻址、路由、流控、时序做了精细处理。这也是我为什么建议真正想“诊断不求人”的人别再满足于鼠标点几下而是至少完整地抓一次全流程报文亲眼看看在几秒钟之内总线上到底发生了什么。我个人在实际操作中的体会是协议这东西看十篇文档不如自己抓一次包。你照着这篇文章的流程找一台自己的车把 VCDS 或者 PCAN 接上完整跑一遍“扫描、会话切换、读 VIN、读故障码”再把抓下来的报文和文章里的拆解对照一遍SAE J2819 这个名字瞬间就落地了。之后再去处理什么编码、匹配、刷写心里就有底了。
返回列表