关于python-can的set_filters
注意下面
如果有车载讨论需要的小伙伴,可以私信加我微信
,拉你进群,和同行业大佬交流
注意上面
前言
之前由公司同事咨询can报文接收问题,其中有个python-can库的set_filters函数如何筛选接收多组报文的问题,为了防止后续忘记,今天进行一下记录
提示:以下是本篇文章正文内容,下面案例可供参考
一、具体代码
import can
from threading import Thread
class pcan_test:
def __init__(self):
self.bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
# self.bus1 = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
def __recv(self):
self.bus.set_filters([{"can_id": 0x100, "can_mask": 0xFF3, "extended": False}])
while True:
msg = self.bus.recv(1)
if msg is not None:
print(msg.arbitration_id)
def recv_c(self):
t1 = Thread(target=self.__recv)
t1.start()
def senddata(self,id,datalist):
msg = can.Message(arbitration_id=id,data=datalist)
self.bus.send(msg)
二、问题解析
上面代码中
self.bus.set_filters([{"can_id": 0x100, "can_mask": 0xFF3, "extended": False}])
这里有一个公式<received_can_id> & can_mask == can_id & can_mask,
这里打个比方:
报文0x108,换算成二进制就是0001 0000 1000,
报文0x104,换算成二进制就是0001 0000 0100,
报文0x103,换算成二进制就是0001 0000 0011。
这里我们只要得到0x108和0x104
我们需要计算出一个二进制一个can_mask的值和他们与能够得到一个固定的值,按照按位与的要求,1&1得1,其他全部为0,
这里我们能计算出FF3这个值,他的二进制值是1111 1111 0011,它与0x108和0x106按位与得到结果都是0x100,
can_id我们可以取0x108或0x106任意一个值就是了
总结
这和Autosar的MCAL层配置邮箱的策略是相似的,canid &maskid = baseid,通过这种设置进行滤波canid,得到我们想要的id信息
写在结尾
我是一名车载集成测试开发工程师,希望能和志同道合的朋友一起相互学习进步