当前位置: 代码网 > it编程>前端脚本>Python > python-can中Notifier类的实现报文的实时分发

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

2026年04月10日 Python 我要评论
前言这个问题之前很早之前就解决了,今天记录一下这个相关知识点,防止后续遗忘一、notifier是什么类notifier是python-can库中的消息分发器,它创建后台线程从 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报文实时分发内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com