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 进程详细解析

    分析运行中的 Python 进程详细解析

    这篇文章主要介绍了分析运行中的 Python 进程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 用python写个颜值评分器筛选最美主播

    用python写个颜值评分器筛选最美主播

    这篇文章主要介绍了我如何用python写颜值评分器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python实现在Linux系统下更改当前进程运行用户

    Python实现在Linux系统下更改当前进程运行用户

    这篇文章主要介绍了Python实现在Linux系统下更改当前进程运行用户,本文直接给出实现代码,需要的朋友可以参考下
    2015-02-02
  • 如何利用Python实现一个论文降重工具

    如何利用Python实现一个论文降重工具

    文章去重(或叫网页去重)是根据文章(或网页)的文字内容来判断多个文章之间是否重复,下面这篇文章主要给大家介绍了关于利用Python实现论文降重工具的相关资料,需要的朋友可以参考下
    2021-07-07
  • python人民币小写转大写辅助工具

    python人民币小写转大写辅助工具

    这篇文章主要为大家详细介绍了python人民币小写转大写辅助工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Python实现登录接口的示例代码

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

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

    150行Python代码实现带界面的数独游戏

    这篇文章主要介绍了150行Python代码实现带界面的数独游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • python语言是免费还是收费的?

    python语言是免费还是收费的?

    在本篇文章里小编给大家分享的是关于python语言是否免费的相关知识点,需要的朋友们可以学习下。
    2020-06-06
  • 在FastAPI中改变响应状态码的两种方法

    在FastAPI中改变响应状态码的两种方法

    FastAPI,顾名思义,是一个快速、现代、高性能的web框架,用于用Python构建后端api,响应状态码是一个三位数,表示请求的结果,在这篇简明的基于示例的博文中,我将向你展示在FastAPI中更改响应状态代码的两种不同方法,需要的朋友可以参考下
    2025-02-02
  • 从基础到进阶带你玩转Python中的异常处理

    从基础到进阶带你玩转Python中的异常处理

    在编程过程中,我们经常会遇到各种运行时错误,比如除零错误、文件未找到错误等,本文将介绍Python异常处理的基础知识,希望对大家有所帮助
    2025-01-01

最新评论