You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python-CAN脚本接收CAN报文数量仅为预期一半的问题咨询

问题排查结论

1. 波特率不匹配不是故障原因

CAN总线要求所有节点波特率完全一致才能正常通信,波特率偏差超过3%就会产生大量CRC校验错误,出现完全丢包或仅有零星错误帧的情况,不可能稳定接收约一半数量的有效报文,因此可以排除发动机ECU波特率为500kbit/s的可能性。

2. 核心问题为代码逻辑错误

你使用self.message_Dict字典存储接收报文,以msg2.arbitration_id作为键,若同一仲裁ID的报文在1秒周期内多次发送,新报文会直接覆盖同ID的旧报文。你统计的len(self.message_Dict)是1秒内收到的不同ID的报文种类数,而非实际接收的报文总条数,这就是统计值远低于预期的根本原因。
发动机CAN总线上绝大多数报文都是周期性重复发送的同ID报文,例如转速、油温这类高频信号的报文可能每数十毫秒就发送一次,1秒内同一个ID会出现多次,全部被字典逻辑覆盖,自然最终统计量只有预期的一半左右。

3. 修复与优化建议

  • 将存储报文的结构从字典改为列表,每收到一条有效报文就append到列表中,1秒周期结束后统计列表长度即可得到实际接收的报文总数
  • 你创建了can.Listener()实例但未实际使用,属于冗余代码可直接删除
  • 同步调用canbus.recv()未设置超时,总线无报文时会一直阻塞,可能影响1秒周期的计时精度,建议设置recv(timeout=0.1)避免长时间阻塞

内容的提问来源于stack exchange,提问作者PythonIsCool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:15:04