vector autosar配置一个CAN接收报文,RTE层发现并未接收到信号,com层IPDU的callout函数也未触发,想知道数据传递到哪一层了,要观测哪个函数?怎样查这个问题
在 AUTOSAR + Vector MICROSAR 架构里,CAN 报文接收路径是分层的。
你现在的现象是:
-
RTE 未收到信号
-
COM 层 I-PDU Callout 未触发
这说明 问题大概率出在 COM 之前(或 COM 未识别该 PDU)。
一、标准接收路径(Vector MICROSAR)
CAN 报文从总线到 RTE 的完整路径:
CAN总线
→ CanDrv (CanIf_RxIndication)
→ PduR_CanIfRxIndication
→ Com_RxIndication
→ Com_RxProcessing_RxPduSigEvent
→ Rte_Write / Rte_Receive
你现在需要确认:数据到底卡在哪一层。
二、排查顺序(推荐按顺序查)
✅ 第一步:确认 CanIf 是否收到报文
重点函数:
CanIf_RxIndication()
怎么查:
-
在该函数打断点
-
或开启 CANIF DET/DEBUG
-
查看是否进入该函数
如果根本没进 CanIf_RxIndication
说明问题在:
-
硬件滤波(HRH配置错误)
-
CanDrv 未配置对应 CAN ID
-
波特率不匹配
-
CAN 控制器未启动
✅ 第二步:确认是否传递到 PduR
关键函数:
PduR_CanIfRxIndication()
如果 CanIf_RxIndication 进了,但 PduR 没进:
👉 检查 CanIfRxPduCfg 里是否配置了:
-
正确的 RxPduId
-
正确的 HRH 绑定
✅ 第三步:确认是否到达 COM
关键函数:
Com_RxIndication()
如果 PduR 进了,但 Com_RxIndication 没进:
👉 说明 PduR 路由表错误
检查:
PduR_RoutingPath
是否从:
CanIf → COM
三、你说的 Callout 没触发,说明什么?
COM 的 I-PDU Callout 是在:
Com_RxIndication()
内部被调用的。
如果 callout 没进,只有两种可能:
-
根本没到 COM
-
IPDU 未被识别(RxPduId 不匹配)
四、最关键的观测函数(按优先级)
建议你按这个顺序打断点:
| 优先级 | 函数 |
|---|---|
| ⭐⭐⭐⭐ | CanIf_RxIndication |
| ⭐⭐⭐⭐ | PduR_CanIfRxIndication |
| ⭐⭐⭐ | Com_RxIndication |
| ⭐⭐ | Com_RxProcessing_RxPduSigEvent |
| ⭐ | Rte_Write_xxx |
五、Vector 特有排查技巧
1️⃣ 打开 CANoe Trace 看 CAN ID 是否正确
确认:
-
ID
-
DLC
-
数据长度
-
是否标准帧/扩展帧
2️⃣ 检查 CanIf 配置
看:
CanIfRxPduCfg
重点看:
-
CanIfRxPduCanId
-
CanIfRxPduDlc
-
CanIfRxPduHrhRef
3️⃣ 检查 HRH 是否匹配
很多时候问题是:
CAN 控制器滤波没有放行该 ID
检查:
CanHardwareObject
是否配置为:
BASIC CAN
FULL CAN
六、常见问题总结(80% 出在这里)
| 问题 | 现象 |
|---|---|
| CAN ID 配错 | CanIf 不触发 |
| HRH 没绑定 | CanIf 不触发 |
| PduR 未路由 | COM 不触发 |
| IPDU ID 不一致 | Callout 不触发 |
| DLC 不一致 | COM 丢弃 |
| 字节序配置错 | RTE 收到 0 |
七、快速判断法(最有效)
你现在的现象说明:
大概率没进入 Com_RxIndication()
所以:
👉 先断在 CanIf_RxIndication
如果都没进,那问题 100% 在:
-
硬件滤波
-
CAN 控制器配置
八、终极定位法(一步到位)
如果项目允许:
在:
CanIf_RxIndication
PduR_CanIfRxIndication
Com_RxIndication
都加一行 GPIO 翻转或 log
看哪个触发。