2、OSI模型与UDS:OSI七层模型、UDS在应用层的实现、诊断通信的物理层与数据链路层

好,咱们今天聊聊OSI模型和UDS的关系。说实话,很多工程师一听到OSI七层模型就头大,觉得这是大学课本里才有的东西。但做UDS诊断,不理解这个模型,你连报文都抓不明白。

我个人习惯把OSI模型比作一个快递系统。物理层是卡车和公路,数据链路层是快递分拣中心,网络层是路由规划,传输层是包裹追踪,会话层是签收流程,表示层是包裹包装,应用层才是你收到的那个快递本身。UDS,就住在最顶层的应用层里。

OSI七层模型速览

先快速过一遍七层模型,咱们重点看下面三层和上面三层。

层级 名称 在UDS中的角色
7 应用层 UDS服务本身(读数据、写数据、例程控制等)
6 表示层 数据编码格式(Intel/Motorola格式)
5 会话层 诊断会话控制(默认/扩展/编程会话)
4 传输层 DoIP中的TCP/UDP、CAN TP的分段传输
3 网络层 DoIP中的IP路由、CAN网络中的地址分配
2 数据链路层 CAN帧结构、以太网MAC层
1 物理层 CAN总线电平、以太网PHY芯片

你想想看,UDS报文从应用层生成,一路往下封装,最后变成CAN总线上的差分信号。接收方再一层层拆开,最终还原成UDS服务。这个过程,说白了就是数据的打包和解包。

UDS在应用层的实现

UDS协议本身定义在ISO 14229-1里,它只关心应用层的事情。比如0x22服务(读取数据)、0x2E服务(写入数据)、0x31服务(例程控制),这些都是应用层的概念。

我记得有一次调试一个ECU,发送0x22请求读取VIN码,结果对方一直回复0x7F(否定响应)。我抓了CAN报文看了半天,发现应用层数据完全正确。后来才意识到,问题出在会话层——ECU当前处于默认会话,不支持这个服务。

关键点:UDS应用层只定义“做什么”,不关心“怎么传”。至于数据是通过CAN总线还是以太网传输,那是下面几层的事。

举个例子,一个标准的UDS请求帧在应用层长这样:

// 0x22服务 - 读取数据标识符
// 请求:22 F1 90
// 22 = 服务ID(读取数据)
// F1 90 = 数据标识符(VIN码)

// 响应:62 F1 90 4C 4D 53 45 47...
// 62 = 肯定响应(服务ID + 0x40)
// F1 90 = 数据标识符
// 4C 4D 53... = VIN码内容(ASCII)

这个报文在应用层就这么简单。但到了数据链路层,它会被拆成多个CAN帧,加上帧ID、DLC、CRC等字段。嗯,这里要注意,CAN总线上你看到的不是“22 F1 90”,而是一堆带ID头的原始数据。

诊断通信的物理层与数据链路层

咱们重点说说物理层和数据链路层,因为这是实际调试中最容易出问题的地方。

物理层:信号的基础

物理层决定了信号怎么在线上传输。对于CAN总线来说,就是CAN_H和CAN_L两根线上的差分电压。

  • CAN总线:显性电平(逻辑0)时,CAN_H比CAN_L高2V左右;隐性电平(逻辑1)时,两者电压接近。
  • 波特率:UDS诊断常用250kbps或500kbps。我遇到过一台车,ECU配置的是500k,但诊断仪设成了250k,结果一帧都收不到。
  • 终端电阻:CAN总线两端各需要120Ω电阻。少了这个,信号反射会导致通信不稳定。

避坑指南:我曾经调试一个项目,诊断通信时好时坏。抓波形发现CAN_H电压只有1.5V,正常应该是2.5V左右。查了半天,发现是线束太长,而且终端电阻装在了ECU内部,外部又加了一个,相当于并联了60Ω。去掉一个电阻后,通信就稳定了。

数据链路层:帧的格式

数据链路层负责把物理层的信号组织成有意义的帧。对于CAN总线,标准帧格式如下:

CAN标准帧(11位ID):
| SOF | 11位ID | RTR | IDE | r0 | 4位DLC | 0-8字节数据 | 15位CRC | CRC界定符 | ACK | EOF |

实际例子(诊断请求):
ID: 0x7DF(功能寻址)
DLC: 8
数据: 02 10 03 00 00 00 00 00
// 02 = 后续数据长度(2字节)
// 10 = 服务ID(诊断会话控制)
// 03 = 子功能(扩展会话)

这里有个细节:CAN帧的数据段最多8字节。但UDS请求可能超过8字节,比如写入一个32字节的密钥。这时候就需要传输层(ISO 15765-2)来做分段传输了。

个人经验:我建议你在调试时,先确认物理层没问题——用示波器看CAN_H/CAN_L波形,确认电压幅值和波特率正确。然后再看数据链路层——用CAN分析工具抓帧,确认ID和DLC对不对。最后才分析应用层的UDS数据。这个顺序能帮你快速定位问题。

从物理层到应用层的完整流程

咱们走一遍完整的流程,你就明白各层是怎么配合的了。

  1. 应用层:诊断仪生成UDS请求,比如0x10 03(切换到扩展会话)。
  2. 传输层:如果数据超过8字节,进行分段。这里只有2字节,直接封装。
  3. 数据链路层:加上CAN帧头(ID、DLC等),组成完整的CAN帧。
  4. 物理层:把CAN帧转换成CAN_H/CAN_L上的差分电压信号。
  5. 接收端:ECU的CAN收发器把差分信号还原成数字信号。
  6. 数据链路层:ECU的CAN控制器解析帧头,提取数据段。
  7. 传输层:重组分段数据(如果有)。
  8. 应用层:ECU解析UDS服务,执行相应操作,返回响应。

你看,一个简单的诊断请求,背后是这么多层的协同工作。哪一层出问题,诊断通信都会失败。

总结一下:做UDS诊断,你不能只盯着应用层的服务ID和子功能。物理层的电平、数据链路层的帧格式、传输层的分段机制,任何一个环节都可能成为瓶颈。我见过太多工程师,应用层代码写得没问题,但就是通信不上,最后发现是CAN总线终端电阻没接好。

下一章咱们会深入聊传输层,特别是CAN TP的分段传输机制。那个才是UDS诊断通信中最容易踩坑的地方。准备好了吗?