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
相关产品推荐
相关产品推荐

