关于python-can的set_filters如何设置过滤问题

10 篇文章 3 订阅
文章介绍了如何使用python-can库中的set_filters函数来筛选并接收特定的CAN报文。通过设定can_id、can_mask和extended参数,利用位运算原理(bitwiseAND)过滤报文ID,确保只接收符合条件的CAN消息。文中以0x108、0x104和0x103为例,展示了如何计算合适的can_mask值(如0xFF3)来过滤出需要的ID。该方法与Autosar的MCAL层配置邮箱策略类似。
摘要由CSDN通过智能技术生成

关于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信息

写在结尾

我是一名车载集成测试开发工程师,希望能和志同道合的朋友一起相互学习进步

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值