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

Python-can配置CAN ID过滤后仍出现非目标ID报文的问题

CAN总线过滤器失效问题排查与修复

你的代码核心问题是总线对象的使用逻辑错误:

  • 函数开头先调用了传入的bus_device的recv方法,这个总线根本没配置过滤器
  • 之后你才创建了带过滤器的新总线对象bus,但后续循环里依然用原来的bus_device接收报文,完全没用到带过滤规则的总线!

一开始只是凑巧收到的都是0x257报文,时间长了未过滤的总线自然会收到其他ID的报文。


修正后的代码方案一(重新创建过滤后的总线)

def read_bus():   
    # 先创建带过滤器的总线对象,确保所有接收操作都用它
    filters = [
        {"can_id": 0x257, "can_mask": 0x7FF, "extended": False}
    ]
    bus = can.interface.Bus(channel="can0", bustype="socketcan", can_filters=filters)
    
    message = None
    while True:
        message = bus.recv(0.2)
        if message:
            break

    try:
        string = "{}:ID={}:LEN={}".format("RX", message.arbitration_id, message.dlc)
        for x in range(message.dlc):
            string += ":{:02x}".format(message.data[x])
    except Exception as e:
        print(e)
    return string

修正后的代码方案二(给传入的总线设置过滤器)

如果必须保留bus_device参数,不能重新创建总线,直接给已有总线添加过滤规则即可:

def read_bus(bus_device):   
    filters = [
        {"can_id": 0x257, "can_mask": 0x7FF, "extended": False}
    ]
    # 给传入的总线设置过滤器
    bus_device.set_filters(filters)
    
    message = None
    while True:
        message = bus_device.recv(0.2)
        if message:
            break

    try:
        string = "{}:ID={}:LEN={}".format("RX", message.arbitration_id, message.dlc)
        for x in range(message.dlc):
            string += ":{:02x}".format(message.data[x])
    except Exception as e:
        print(e)
    return string

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:05:28