CAN 是多节点共用的一条总线,消息 ID 同时表示这帧是什么和它有多高优先级。多个节点一起发送时,显性位会覆盖隐性位,ID 更小的帧继续发送,其他节点停下来,等总线空闲后再试。这种逐位仲裁没有把低优先级帧“撞坏”,但它会拉长低优先级消息的等待时间。
仲裁优先级要按截止期分配
给消息分配 ID 时,先列出控制周期、最大允许等待时间和报文长度,再决定优先级。急停、状态闭锁等帧不应与低频诊断、配置下发使用同一优先级。总线在高负载时,高优先级帧仍然会被当前正在发送的一帧挡住,因此预算里还要包含最大帧时间和可能的重发。
CAN 的 ACK 也容易被误读。它证明有接收节点确认了位级正确性,不证明接收方接受了业务命令,更不证明电机已经运动。需要业务闭环时,应定义独立的状态反馈、序号和超时。
出错时先分层,不要直接重发
排查顺序通常是物理层、控制器配置、总线状态和应用协议:确认线缆、地线、终端电阻和收发器供电;确认所有节点 bitrate 与采样点一致;读取 error-active、error-passive、bus-off 状态和错误计数;最后再检查 ID、字节序、长度和信号范围。bus-off 自动恢复可能掩盖持续的物理问题,恢复前应记录原因并限制重试频率。
参考:EmbedSummary