python-can中Notifier类的实现报文的实时分发

 更新时间:2026年04月10日 10:25:30   作者:名字太俊不提也罢  
文章介绍了利用python-can库中的Notifier类创建一个线程来从总线读取CAN消息,并通过回调函数将消息分发给监听对象,具有一定的参考价值,感兴趣的可以了解一下

前言

这个问题之前很早之前就解决了,今天记录一下这个相关知识点,防止后续遗忘

一、Notifier是什么类

Notifier 是 python-can 库中的消息分发器,它创建后台线程从 CAN 总线持续读取消息,并实时分发给所有注册的监听器(Listeners)

Notifier 对象用作总线的消息分发器。Notifier 创建一个线程来从总线读取消息并将它们分发给需要监听的对象

核心工作流程

CAN 总线 → Notifier(后台线程) → Listener1 → 处理逻辑
                              → Listener2 → 日志记录
                              → Listener3 → 队列缓存

二、具体实现代码

代码如下(示例):

class CanTool():
    def __init__(self):
        self.__mq = queue.Queue(50)
        self.__bus = None
        self.__notifier = None

    def notifier_init(self):
        """
        功能:初始化报文消息得回调函数
        """
        logger = can.Logger("logfile.asc")
        listeners = [
            self.put_mq,  # 回调函数,通过队列返回报文消息
            logger,  # 保存log日志,asc格式
        ]
        self.__notifier = can.Notifier(self.__bus, listeners) #接收来自self.__bus的报文,分发给listeners对象


    def bus_init(self, device: Optional[str], channel:Optional[str], bitrate:Optional[int]):
        """
        功能:初始化总线设备
        param1:设备名。str
        param2:通道,str
        param3:波特率,int
        """
        try:
            self.__bus = can.interface.Bus(bustype=device, channel=channel, bitrate=bitrate)
            self.notifier_init()
            return self.__bus
        except Exception:
            return self.__bus


    def put_mq(self,msg: Optional[can.Message]):
        """
        功能:接收报文得回调函数
        param1:分发得到的报文对象
        """
        if not self.__mq.full():
            self.__mq.put_nowait(msg)	#通过队列进行传输

    def busclose(self):
        """
        功能:结束总线收发,回收资源
        """
        self.__notifier.stop()	#停止分发
        self.__bus.shutdown()	#停止这个bus

总结

由于Python语言本身的问题,当程序读取写较大的总线消息时,会存在各种各样的问题,本文中的方案,结合前面的报文筛选功能,能解决大部分这相关的问题。

重要注意事项

要点说明
必须调用 stop()否则监听器可能无法刷新缓冲区,导致数据丢失
线程安全自定义监听器的 on_message_received 需考虑线程安全
避免阻塞监听器中的处理应尽量快速,耗时操作请用队列
异常处理监听器可实现 on_error() 来捕获异常

写在结尾

到此这篇关于python-can中Notifier类的实现报文的实时分发的文章就介绍到这了,更多相关python-can报文实时分发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Python+Selenium浏览器自动化测试与网页自动登录

    Python+Selenium浏览器自动化测试与网页自动登录

    在日常开发、测试和办公自动化中,我们经常会遇到一些重复性的浏览器操作,如果这些操作每天都要重复执行,手动处理不仅浪费时间,还容易因为漏点、输错、忘记截图而出错,本文面向Python自动化测试初学者,通过一个完整案例讲解如何使用Selenium自动打开网页
    2026-05-05
  • Python字符串处理方法超全攻略

    Python字符串处理方法超全攻略

    字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,这篇文章主要介绍了Python字符串处理方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • Python3中的map函数调用后内存释放问题

    Python3中的map函数调用后内存释放问题

    这篇文章主要介绍了Python3中的map函数调用后内存释放问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 让你一文弄懂Pandas文本数据处理

    让你一文弄懂Pandas文本数据处理

    文本数据具有数据维度高、数据量大且语义复杂等特点,是一种较为复杂的数据类型,下面这篇文章主要给大家介绍了关于Pandas文本数据处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python中xmltodict对xml的操作方式

    Python中xmltodict对xml的操作方式

    这篇文章主要介绍了Python中xmltodict对xml的操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 基于Python制作股票交易计算器

    基于Python制作股票交易计算器

    这篇文章主要为大家详细介绍了如何利用Python和Html分别制作一个股票交易计算器,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2024-12-12
  • 10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)

    10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)

    这篇文章主要介绍了10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招),目前在国内通过手机短信保障信息安全是比较常见的,具体实例代码大家跟随小编一起通过本文学习吧
    2018-10-10
  • Python中pymysql 模块的使用详解

    Python中pymysql 模块的使用详解

    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。但目前pymysql支持python3.x而后者不支持3.x版本。
    2019-08-08
  • python通过imaplib模块读取gmail里邮件的方法

    python通过imaplib模块读取gmail里邮件的方法

    这篇文章主要介绍了python通过imaplib模块读取gmail里邮件的方法,涉及Python操作imaplib模块操作邮件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python实现登录接口的示例代码

    Python实现登录接口的示例代码

    本篇文章主要介绍了Python实现登录接口的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论