AUTOSAR 通信栈深度解析:PduR 与 CanTp 的交互机制(图文详解)
在 AUTOSAR 经典平台(Classic Platform)中,通信栈(ComStack)是实现 ECU 之间数据通信的核心。
其中,PduR(PDU Router) 负责数据路由,CanTp(CAN Transport Protocol) 负责长报文分帧与重组。
但很多人容易误解:
PduR 与 CanTp 的交互并不是为 COM 模块服务,而是 专门服务于 DCM(诊断通信管理模块)。
本文将通过图文形式,详细讲解 DCM–PduR–CanTp 之间的交互机制。

🧭 一、总体架构与数据流
在 AUTOSAR 的 CAN 通信栈中,数据从应用层传递到物理 CAN 总线的路径如下:
Application (UDS 服务层)│▼DCM│▼PduR│▼CanTp│▼CanIf│▼CAN Driver
🧩 二、各模块职责说明
| 模块 | 职责 | 特点 |
|---|---|---|
| Application / UDS 服务层 | 发起或处理诊断请求(如 0x10、0x22 等) | 依赖 DCM 提供通信接口 |
| DCM (Diagnostic Communication Manager) | 管理 UDS 通信、诊断会话、传输分段逻辑 | 上层模块 |
| PduR (PDU Router) | 在上层(DCM)与下层(CanTp)之间路由数据 | 不修改 PDU 内容 |
| CanTp (CAN Transport Protocol) | 实现 ISO 15765-2 传输协议(分帧、重组、流控) | 传输层 |
| CanIf (CAN Interface) | 提供 CAN 硬件抽象接口 | 与驱动直接交互 |
| CanDrv (CAN Driver) | 操作硬件控制器发送/接收物理帧 | 底层驱动 |
🚀 三、发送流程(DCM → PduR → CanTp)
当应用层通过 DCM 发送一条诊断请求(例如 0x10 StartDiagnosticSession)时,数据流如下:
🧩 发送方向(Tx Path)
Application → DCM → PduR → CanTp → CanIf → CAN 驱动
详细流程:
- DCM → PduR
DCM 调用:PduR_DcmTransmit(PduIdType id, const PduInfoType* info);
发起长报文传输请求。 - PduR → CanTp
根据配置,PduR 调用:CanTp_Transmit(PduIdType id, const PduInfoType* info);
将该 PDU 交给传输层处理。 - CanTp → PduR(请求数据)
在发送过程中,CanTp 分帧时会多次调用:PduR_CanTpCopyTxData(PduIdType id, PduInfoType* info, RetryInfoType* retry, PduLengthType* availableDataPtr);
请求下一段要发送的数据。 - CanTp → CanIf
CanTp 调用CanIf_Transmit(),发送 First Frame / Consecutive Frame / Flow Control 等多帧。 - CanTp ← CanIf(发送确认)
当所有帧发送完成时,CanIf 调用CanTp_TxConfirmation()。 - CanTp → PduR
CanTp 调用:PduR_CanTpTxConfirmation(PduIdType id, Std_ReturnType result);
通知 PduR 传输结束。 - PduR → DCM
PduR 再回调:Dcm_TxConfirmation(PduIdType id, Std_ReturnType result);
通知诊断上层发送完成。
📥 四、接收流程(CanTp → PduR → DCM)
当 ECU 收到来自测试仪的诊断请求(例如 0x22 ReadDataByIdentifier)时,流程如下:
🧩 接收方向(Rx Path)
CAN 驱动 → CanIf → CanTp → PduR → DCM → 应用层
详细流程:
- CanIf → CanTp
底层驱动接收到 L-PDU 后,CanIf 调用:CanTp_RxIndication(PduIdType id, const PduInfoType* info); - CanTp → PduR(开始接收)
当检测到新的长报文开始时,CanTp 调用:PduR_CanTpStartOfReception(PduIdType id, const PduInfoType* info, PduLengthType TpSduLength, PduLengthType* bufferSizePtr); - CanTp → PduR(逐段拷贝数据)
每收到一帧,CanTp 调用:PduR_CanTpCopyRxData(PduIdType id, PduInfoType* info, PduLengthType* bufferSizePtr); - CanTp → PduR(接收完成)
所有帧接收完成或出现错误时,CanTp 调用:PduR_CanTpRxIndication(PduIdType id, Std_ReturnType result); - PduR → DCM
最后,PduR 通知 DCM:Dcm_RxIndication(PduIdType id, Std_ReturnType result);
DCM 解析完整的诊断请求,进入协议处理阶段。
📊 五、接口调用方向总览
| 场景 | 调用方向 | 接口名称 |
|---|---|---|
| DCM 发起传输 | DCM → PduR | PduR_DcmTransmit() |
| PduR 调用传输层 | PduR → CanTp | CanTp_Transmit() |
| 传输中数据请求 | CanTp → PduR | PduR_CanTpCopyTxData() |
| 传输完成通知 | CanTp → PduR | PduR_CanTpTxConfirmation() |
| 接收开始 | CanTp → PduR | PduR_CanTpStartOfReception() |
| 接收中数据交付 | CanTp → PduR | PduR_CanTpCopyRxData() |
| 接收完成 | CanTp → PduR | PduR_CanTpRxIndication() |
| 上层回调 | PduR → DCM | Dcm_RxIndication() / Dcm_TxConfirmation() |
🧠 六、关键点解析
- PduR 不修改 PDU 内容
它仅负责路由数据、协调缓冲区,数据内容保持原样。
(除网关场景外,不会做内容修改) - CanTp 实现 ISO 15765-2 协议
负责 First Frame、Consecutive Frame、Flow Control 机制,确保大数据可靠传输。 - DCM 是唯一使用 CanTp 的上层模块
COM 模块不经过 CanTp,周期通信直接走 CanIf。 - 交互是完全回调驱动的异步流程
没有共享内存,所有数据交互通过接口调用完成。
⚙️ 七、架构图示
┌──────────────┐│ Application ││ (UDS Services)│└──────┬───────┘│DCM│┌──────▼──────┐│ PduR │ ← 路由中心└──────┬──────┘│CanTp│CanIf│CAN Driver
🧩 八、常见误区与建议
| 常见误区 | 正确理解 |
|---|---|
| “PduR 直接与 COM 通信并使用 CanTp” | ❌ 错,PduR 与 CanTp 的交互只存在于 DCM 通路中。 |
| “PduR 会修改数据” | ❌ 不会,PduR 仅路由数据。 |
| “TxConfirmation 是 PduR 调用 CanTp 的” | ❌ 反向,CanTp 回调 PduR_CanTpTxConfirmation()。 |
| “CanTp 自动选择是否分帧” | ❌ 分帧逻辑由配置决定(N-PDU 长度与帧类型)。 |
实践建议:
- 确认 DCM 的 N-SDU 配置与 CanTp 通道匹配。
- 检查 PduR 路由表是否正确映射 DCM ↔ CanTp。
- 注意 CanTp 的超时参数:
N_As,N_Bs,N_Cs。 - 抓取 CAN 总线数据可直观看到 FF / CF / FC 分帧过程。
✅ 九、总结
| 模块 | 职责 | 上下层关系 |
|---|---|---|
| DCM | 诊断通信、UDS 协议处理 | 上层 |
| PduR | 路由数据、协调缓冲 | 中层 |
| CanTp | 实现 ISO 15765-2 分帧协议 | 传输层 |
| CanIf | 提供 CAN 驱动抽象接口 | 接口层 |
| CanDrv | 控制器驱动 | 底层 |
简要结论:
- DCM ↔ PduR ↔ CanTp 构成诊断通信的核心路径;
- COM ↔ PduR ↔ CanIf 则负责普通周期通信。
- 只有 DCM 通路才会触发 CanTp 的多帧传输机制。
📚 参考文档:
- AUTOSAR_SWS_PduR, Release R20-11
- AUTOSAR_SWS_CanTp, Release R20-11
- AUTOSAR_SWS_DCM, Release R20-11
- ISO 15765-2:2016 — Road vehicles – Diagnostic communication over CAN
