✅ 1. DLC 与 Data Length 的区别
字段名 | 含义 | 备注 |
---|---|---|
DLC (Data Length Code) | 指示该 CAN 帧声明的数据长度(0~8) | 这是 报文头中的信息 |
Data Length | CANoe 实际提取并显示的 Data 字节数量 | 一般是 等于 DLC,但有例外(如下) |
✅ 2. 为什么 DLC ≠ 8 而 Data Length = 8?
🎯 这是因为trace中显示的是 ISO-TP 传输,CANoe 做了“协议层重组”:
在 CANoe 的 Trace 窗口中,有两种不同的报文层次可以观察:
模式 | 描述 |
---|---|
原始 CAN Frame 视图 | 展示真实 DLC 和物理层数据 |
诊断或 ISO-TP 重组视图 | 展示重组后的 TP 报文,Data length 固定为 8 字节块,用于协议分析 |
图中的视图,是 CANoe 的诊断解析视图(带 ISO-TP 解码器),所以:
-
Data Length = 8:表示 每帧 TP 层的 Payload 数据为 8 字节块(不管 DLC 是多少,始终以 TP 块长度显示)。
-
DLC < 8 的帧(如 Flow Control 帧,只有 3 字节),仍会被“协议视角”当作一个 完整 TP 单位显示为 Data Length 8。
例如:
类型 | 实际 DLC | 显示 Data Length | 原因 |
---|---|---|---|
Flow Control CTS | 3 | 8 | CANoe 为了对齐 ISO-TP 报文,以 8 字节显示 |
Single Frame | 3 | 8 | 同上,协议栈统一按 8 字节显示 |
再比如trace中有DLC=53, 其实这里的DLC不是CAN协议帧里的DLC了。
✅ CANoe 的 ISO-TP 视图逻辑是:所有 ISO-TP 协议帧(SF/FF/CF/FC)都以标准 CAN Frame 的最大数据长度(8 字节)显示,以保证一致性和可重组性。
"The DLC (DataLengthCode) of USDT frames on Classic CAN format shall always be set to eight."
这句话并不是错的,但它有特定的上下文要求 —— 它属于某些OEM诊断规范或工业标准(如 AUTOSAR 或 OEM UDS implementation guideline)中对 UDS over CAN(又称 USDT, Unified Diagnostic Services Transport) 的一种协议实现强制约定。
✅ 正确理解这句话的背景
这句话的语义是:
在 Classic CAN 上传输 UDS(USDT)协议时,所有的帧(SF/FF/CF/FC)都必须设置 DLC = 8,即使实际数据不到 8 字节,也要填充补齐。
(根据上图显示,其实已经实现了DLC=8,因为它已经补0了,只是CANoe的trace显示的是实际的DCL而已)
🔍 这个规定是物理层上的封装策略,背后的目的有以下几点:
-
统一报文长度,简化接收处理逻辑(减少变长处理复杂度)
-
防止某些接收端解析错误(有些老旧的 ECU 对 DLC < 8 的帧处理不当)
-
便于硬件和诊断栈优化(如 DMA 处理、接收队列标准化)
✅ 举个例子:
类型 | 原始 UDS 协议规范允许 | 某些 OEM 要求 |
---|---|---|
Flow Control 帧 | DLC = 3(例如 30 00 00 ) | DLC = 8(补零 30 00 00 00 00 00 00 00 ) |
Single Frame | DLC = 3(02 10 01 ) | DLC = 8(02 10 01 00 00 00 00 00 ) |
3. ISO 15765-2 标准 是什么,是怎么定义DLC 和Data Length的?
我们现在从标准的角度(特别是你问的 ISO 15765-2)来详细解释:
✅ 一、什么是 ISO 15765-2?
-
全名:
ISO 15765-2: Road vehicles — Diagnostic communication over Controller Area Network (DoCAN) — Part 2: Transport protocol and network layer services
-
它是 UDS(Unified Diagnostic Services)在 CAN 总线上进行多帧传输(分段传输)的协议标准
-
它描述了如何通过标准 CAN(8字节)或 CAN FD(最多64字节)来传输超过1帧的数据
✅ 二、在 ISO 15765-2 中,对 DLC 和 Data Length 的定义
📌 1. DLC(Data Length Code)
✅ 标准中关于 DLC 的定义(摘自 ISO 15765-2):
Each CAN frame shall have a DLC field indicating the number of data bytes in the frame. For Classical CAN, the maximum is 8 bytes.
即:
-
DLC 是 CAN 帧头部的字段,用于声明这帧的数据字节数(最大 8)
-
它并不要求一定是 8,完全可以是 1~8,根据帧类型的内容而定
举例:
ISO-TP 帧类型 | 最小要求的数据字节数 | 合法的 DLC 范围 |
---|---|---|
Single Frame (SF) | 至少 2 字节(PCI + Data) | 2 ~ 8 |
First Frame (FF) | 固定 8 字节 | DLC = 8 |
Consecutive Frame (CF) | 推荐 8 字节(更高吞吐率) | 通常 DLC = 8 |
Flow Control (FC) | 最少 3 字节(FS, BS, STmin) | 3 ~ 8(都合法) |
✅ 所以从标准角度看:
DLC 并不强制为 8,除非具体帧类型要求它是 8。
📌 2. Data Length(不是标准术语)
在 ISO 15765-2 中并没有 “Data Length” 这个术语,它是 Vector 工具(如 CANoe、CANalyzer)引入的一个界面显示字段,用于指示:
一帧 CAN 报文的 Data 字段中实际提取出来的内容长度
但这个字段是软件层面派生出来的,不是协议的一部分,所以:
-
它可能总是显示为 8(为了解析便利)
-
也可能反映实际 DLC 长度(如果工具未启用协议解析)
✅ 三、标准里有没有规定必须填充至 8 字节?
📖 ISO 15765-2 标准的态度是:
不要求所有帧都填充到 DLC = 8
只要求数据在 ISO-TP 封装结构中格式正确即可
但某些 OEM(如 VW, BMW, Ford)可能会规定:
所有 UDS 帧在 Classic CAN 上传输时,DLC 必须填充为 8,空位补 0x00
➡️ 这不是 ISO 标准的要求,而是OEM-specific implementation requirement
✅ 一、三大协议标准概览
协议 | 全称 | 作用 | 定义的内容 |
---|---|---|---|
ISO 11898 | CAN (Controller Area Network) | 物理层 & 数据链路层 | CAN 帧结构、DLC、仲裁、位定时等 |
ISO 15765-2 | DoCAN (Diagnostics over CAN) | 网络层 & 传输层(TP) | 多帧传输、分段机制、FlowControl 等 |
ISO 14229-1 | UDS (Unified Diagnostic Services) | 应用层 | UDS 服务(如 0x10、0x22、0x2E)及行为逻辑 |
🔍 详细关系说明:
✅ 1. ISO 11898 – 最底层,CAN 通信基础
-
定义了 CAN 帧结构(ID, DLC, Data)
-
最大数据长度 = 8 字节(Classic CAN)
-
DLC 是标准字段(Data Length Code)
✅ 2. ISO 15765-2 – CAN 上传输诊断服务的“传输协议”
-
把 UDS 的一个大数据包切成多个 CAN 帧(SF, FF, CF, FC)
-
实现“分段发送”、“流控机制”、“顺序编号”等
-
是 UDS 在 CAN 上传输的“桥梁协议”
-
和 ISO 11898 一起定义了诊断通信的 CAN Frame 使用方式
✅ 3. ISO 14229-1 – UDS 应用协议
-
定义了真正的诊断服务,例如:
-
0x10
DiagnosticSessionControl -
0x22
ReadDataByIdentifier -
0x2E
WriteDataByIdentifier -
0x34
RequestDownload
-
-
完全不关心底层如何传输(它“假设”传输层能可靠送达)
✅ 举个例子:一条 UDS 诊断请求如何跨这三层传输?
你要请求 ECU 进入扩展会话(Extended Diagnostic Session),服务号 0x10 0x03
。
过程如下:
层级 | 所属标准 | 实际传输内容 |
---|---|---|
应用层 | ISO 14229-1 | 发送:10 03 |
传输层 | ISO 15765-2 | 打包为 SF 或 FF+CF+... |
CAN 层 | ISO 11898 | 发送 CAN 帧,含 ID、DLC、Data(如 02 10 03 00 00 00 00 00 ) |
✅ 补充:对应的标准文档全名
协议 | 标准编号 | 名称 |
---|---|---|
CAN 基础层 | ISO 11898-1:2015 | Controller Area Network — Part 1: Data link layer and physical signalling |
CAN 诊断传输 | ISO 15765-2:2016 | Road vehicles — Diagnostic communication over CAN — Part 2: Transport protocol and network layer services |
诊断服务应用层 | ISO 14229-1:2020 | Road vehicles — Unified Diagnostic Services (UDS) — Part 1: Application layer |
✅ 项目中的使用关系总结:
| 你在 ECU 中开发的诊断服务(如 RDBI、DTC)是基于:| ISO 14229 |
| 实际在 CAN 总线上如何分帧发送,是基于: | ISO 15765-2 |
| 每一帧 CAN 的结构、ID、DLC、物理层传输,是基于: | ISO 11898 |
✅ Vector 工具中对应关系
Vector 工具 | 协议层 | 描述 |
---|---|---|
CANoe Trace Raw View | ISO 11898 | 显示 CAN 报文物理结构(ID、DLC、Data) |
CANoe Diagnostic View / ISO-TP View | ISO 15765-2 | 显示多帧合并、Event Type(SF/CF/FC) |
Diagnostic Console / .CDD / .ODX | ISO 14229 | 显示 UDS 服务、参数名、值等信息 |
3.关于CAN与CAN-FD的DLC(Data Length Code)定义,综合技术文档中的规范要求,其核心差异及定义如下:
一、经典CAN的DLC定义
-
数据长度范围
DLC值范围 0–8,严格对应实际数据字节长度:DLC=0
→ 0字节数据DLC=1
→ 1字节数据- ...
DLC=8
→ 8字节数据
-
无效DLC处理
任何DLC值 >8 的帧(如DLC=9–15),均被视为8字节数据处理。接收方按8字节解析,超长部分被忽略。 -
填充要求
数据域不足8字节时,未使用部分需填充0x00
,接收方不校验填充内容。
二、CAN-FD的DLC定义
-
扩展数据长度
DLC值范围 0–15,对应数据字节如下表:DLC值 数据字节数 0–8 0–8字节 9 12字节 10 16字节 11 20字节 12 24字节 13 32字节 14 48字节 15 64字节 注:数据长度按DLC映射至最近更大的标准值(如DLC=9 → 12字节)。 -
无效DLC处理
DLC值超出 8–15范围的帧(如DLC=1–7或>15),接收方直接丢弃且不响应(见测试用例ID:1021958)。 -
填充规则
与经典CAN一致,未使用数据域填充0x00
,接收方忽略填充
三、关键差异对比
特性 | 经典CAN | CAN-FD |
---|---|---|
最大数据长度 | 8字节 | 64字节 |
DLC=9处理 | 强制视为8字节 | 映射为12字节 |
诊断帧要求 | DLC必须=8 | DLC需在8–15范围内 |
无效帧响应 | 静默丢弃 | 无响应(见测试用例) |
四、工程实践要点
- 诊断协议兼容性
- 经典CAN诊断帧必须设置
DLC=8
,否则接收方拒收(测试用例ID:1021958/1021960)。 - CAN-FD诊断帧DLC需匹配数据长度,例如传输12字节数据时需设
DLC=9
- 经典CAN诊断帧必须设置
- 错误场景验证
测试中需覆盖无效DLC场景(如DLC=7的CAN-FD帧),确认ECU无响应(符合测试用例ID:1021962)
CAN message 属性DLC和DataLength,极易混淆_can dlc-CSDN博客