运行时问题定位 Q1:某路 CAN 报文没发出来——从 Rte_Write 顺藤摸瓜,逐层查哪个返回值?
原始 Flomo:https://v.flomoapp.com/mine/?memo_id=MjU0NzczMjE3
运行时问题定位 Q1:某路 CAN 报文没发出来——从 Rte_Write 顺藤摸瓜,逐层查哪个返回值?
关键思路:沿发送链路逐层看返回值,哪一层返回 E_NOT_OK 就锁定在哪一层(或它的下游配置)。
发送链路与检查点:
-
RTE:Rte_Write 返回 E_OK / E_NOT_OK。返回错 → 端口/接口或该 PDU 配置有问题。
-
COM:Com_TransmitSignal / Com_UpdateShadowSignal 是否接受信号、信号是否映射到 PDU。返回错 → 信号没映射到 PDU 或 PDU 未配置。
-
PduR:PduR_Transmit 把 PDU 路由到对应通信接口。返回错 → 路由表项缺失(没配到 CanIf)。
-
CanIf:CanIf_Transmit 把 PDU 交给 Can 驱动。返回错 → CanIf 底层(Tx Buffering / Can Controller)未就绪。
-
Can 驱动:Can_Write 发到硬件。看返回值 + 发送队列是否满 / Bus-off。
容易漏的补充排查点:
- 周期性 PDU 还没到发送周期(没触发)。
- PDU 的传输方向(Tx / Rx)配反了。
- Can 控制器还没到 Normal mode(Can_ControllerModeChange 是否成功、有没有 Bus-off)。
- 被 Bus-off 压住:Can 驱动在 Bus-off 时不发送。
- 信号值被判为 InvalidValue 而没发送。
一句话:从 Rte_Write 到 Can_Write 逐层看返回值,顺带查方向、周期、Bus-off/控制器模式;先定位到层,再深入层内配置。
上一题:https://v.flomoapp.com/mine/?memo_id=MjU0NzczMTY2
总表:https://v.flomoapp.com/mine/?memo_id=MjMxMTQ2NDk4
API 与排查边界修订
不能把每条 Rte_Write 都当成直接调用 Com_TransmitSignal:RTE 根据通信类型、生成策略和 ECU 部署实现数据写入;COM 的信号/PDU 发送由相应 COM 配置和 MainFunction/触发机制推进。Rte_Write 的返回类型/可检查返回值也取决于生成的 API 原型和接口配置,应以工程 Rte_* 头文件为准。
建议结合三类证据,而不只追返回值:
- RTE/COM 生成代码与 API 原型:确认写入是否成功、数据是否进入正确 buffer。
- CANoe/CANalyzer Trace:确认 PDU 是否被提交、实际发送时间、错误状态和 BusOff。
- CanIf/Can Driver 状态与控制器模式:确认发送队列、HTH、控制器状态、Tx confirmation 和错误计数。
若使用周期发送,Rte_Write 成功只说明数据写入接口成功,不代表该帧已立即上总线。