
这是因为trace中显示的是 ISO-TP 传输,CANoe 做了“协议层重组”:
在 CANoe 的 Trace 窗口中,有两种不同的报文层次可以观察:
图中的视图,是 CANoe 的诊断解析视图(带 ISO-TP 解码器),所以:
- Data Length = 8:表示 每帧 TP 层的 Payload 数据为 8 字节块(不管 DLC 是多少,始终以 TP 块长度显示)。
- DLC < 8 的帧(如 Flow Control 帧,只有 3 字节),仍会被“协议视角”当作一个 完整 TP 单位显示为 Data Length 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 处理、接收队列标准化)
3. ISO 15765-2 标准 是什么,是怎么定义DLC 和Data Length的?
我们现在从标准的角度(特别是你问的 ISO 15765-2)来详细解释:
- 全名:
- 它是 UDS(Unified Diagnostic Services)在 CAN 总线上进行多帧传输(分段传输)的协议标准
- 它描述了如何通过标准 CAN(8字节)或 CAN FD(最多64字节)来传输超过1帧的数据
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,根据帧类型的内容而定
举例:
✅ 所以从标准角度看:
DLC 并不强制为 8,除非具体帧类型要求它是 8。
2. Data Length(不是标准术语)
在 ISO 15765-2 中并没有 “Data Length” 这个术语,它是 Vector 工具(如 CANoe、CANalyzer)引入的一个界面显示字段,用于指示:
一帧 CAN 报文的 Data 字段中实际提取出来的内容长度
但这个字段是软件层面派生出来的,不是协议的一部分,所以:
- 它可能总是显示为 8(为了解析便利)
- 也可能反映实际 DLC 长度(如果工具未启用协议解析)
ISO 15765-2 标准的态度是:
但某些 OEM(如 VW, BMW, Ford)可能会规定:
所有 UDS 帧在 Classic CAN 上传输时,DLC 必须填充为 8,空位补 0x00
➡️ 这不是 ISO 标准的要求,而是OEM-specific implementation requirement
✅ 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 应用协议
- 定义了真正的诊断服务,例如:
- DiagnosticSessionControl
- ReadDataByIdentifier
- WriteDataByIdentifier
- RequestDownload
- 完全不关心底层如何传输(它“假设”传输层能可靠送达)
你要请求 ECU 进入扩展会话(Extended Diagnostic Session),服务号 。
过程如下:
| 你在 ECU 中开发的诊断服务(如 RDBI、DTC)是基于:| ISO 14229 |
| 实际在 CAN 总线上如何分帧发送,是基于: | ISO 15765-2 |
| 每一帧 CAN 的结构、ID、DLC、物理层传输,是基于: | ISO 11898 |
一、经典CAN的DLC定义
- 数据长度范围
DLC值范围 0–8,严格对应实际数据字节长度:
- → 0字节数据
- → 1字节数据
- …
- → 8字节数据
- 无效DLC处理
任何DLC值 >8 的帧(如DLC=9–15),均被视为8字节数据处理。接收方按8字节解析,超长部分被忽略。
- 填充要求
数据域不足8字节时,未使用部分需填充 ,接收方不校验填充内容。
二、CAN-FD的DLC定义
- 扩展数据长度
DLC值范围 0–15,对应数据字节如下表:
DLC值数据字节数0–80–8字节912字节1016字节1120字节1224字节1332字节1448字节1564字节 注:数据长度按DLC映射至最近更大的标准值(如DLC=9 → 12字节)。 - 无效DLC处理
DLC值超出 8–15范围的帧(如DLC=1–7或>15),接收方直接丢弃且不响应(见测试用例ID:)。
- 填充规则
与经典CAN一致,未使用数据域填充,接收方忽略填充
三、关键差异对比
四、工程实践要点
- 诊断协议兼容性
- 经典CAN诊断帧必须设置 ,否则接收方拒收(测试用例ID:⁄)。
- CAN-FD诊断帧DLC需匹配数据长度,例如传输12字节数据时需设
- 错误场景验证
测试中需覆盖无效DLC场景(如DLC=7的CAN-FD帧),确认ECU无响应(符合测试用例ID:)
CAN message 属性DLC和DataLength,极易混淆_can dlc-CSDN博客
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/231472.html