python-can中Notifier類的實現(xiàn)報文的實時分發(fā)
前言
這個問題之前很早之前就解決了,今天記錄一下這個相關(guān)知識點,防止后續(xù)遺忘
一、Notifier是什么類
Notifier 是 python-can 庫中的消息分發(fā)器,它創(chuàng)建后臺線程從 CAN 總線持續(xù)讀取消息,并實時分發(fā)給所有注冊的監(jiān)聽器(Listeners)
Notifier 對象用作總線的消息分發(fā)器。Notifier 創(chuàng)建一個線程來從總線讀取消息并將它們分發(fā)給需要監(jiān)聽的對象
核心工作流程
CAN 總線 → Notifier(后臺線程) → Listener1 → 處理邏輯
→ Listener2 → 日志記錄
→ Listener3 → 隊列緩存二、具體實現(xiàn)代碼
代碼如下(示例):
class CanTool():
def __init__(self):
self.__mq = queue.Queue(50)
self.__bus = None
self.__notifier = None
def notifier_init(self):
"""
功能:初始化報文消息得回調(diào)函數(shù)
"""
logger = can.Logger("logfile.asc")
listeners = [
self.put_mq, # 回調(diào)函數(shù),通過隊列返回報文消息
logger, # 保存log日志,asc格式
]
self.__notifier = can.Notifier(self.__bus, listeners) #接收來自self.__bus的報文,分發(fā)給listeners對象
def bus_init(self, device: Optional[str], channel:Optional[str], bitrate:Optional[int]):
"""
功能:初始化總線設(shè)備
param1:設(shè)備名。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]):
"""
功能:接收報文得回調(diào)函數(shù)
param1:分發(fā)得到的報文對象
"""
if not self.__mq.full():
self.__mq.put_nowait(msg) #通過隊列進行傳輸
def busclose(self):
"""
功能:結(jié)束總線收發(fā),回收資源
"""
self.__notifier.stop() #停止分發(fā)
self.__bus.shutdown() #停止這個bus
總結(jié)
由于Python語言本身的問題,當程序讀取寫較大的總線消息時,會存在各種各樣的問題,本文中的方案,結(jié)合前面的報文篩選功能,能解決大部分這相關(guān)的問題。
重要注意事項
| 要點 | 說明 |
|---|---|
| 必須調(diào)用 stop() | 否則監(jiān)聽器可能無法刷新緩沖區(qū),導(dǎo)致數(shù)據(jù)丟失 |
| 線程安全 | 自定義監(jiān)聽器的 on_message_received 需考慮線程安全 |
| 避免阻塞 | 監(jiān)聽器中的處理應(yīng)盡量快速,耗時操作請用隊列 |
| 異常處理 | 監(jiān)聽器可實現(xiàn) on_error() 來捕獲異常 |
寫在結(jié)尾
到此這篇關(guān)于python-can中Notifier類的實現(xiàn)報文的實時分發(fā)的文章就介紹到這了,更多相關(guān)python-can報文實時分發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+Selenium瀏覽器自動化測試與網(wǎng)頁自動登錄
在日常開發(fā)、測試和辦公自動化中,我們經(jīng)常會遇到一些重復(fù)性的瀏覽器操作,如果這些操作每天都要重復(fù)執(zhí)行,手動處理不僅浪費時間,還容易因為漏點、輸錯、忘記截圖而出錯,本文面向Python自動化測試初學(xué)者,通過一個完整案例講解如何使用Selenium自動打開網(wǎng)頁2026-05-05
Python3中的map函數(shù)調(diào)用后內(nèi)存釋放問題
這篇文章主要介紹了Python3中的map函數(shù)調(diào)用后內(nèi)存釋放問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
10 行 Python 代碼教你自動發(fā)送短信(不想回復(fù)工作郵件妙招)
這篇文章主要介紹了10 行 Python 代碼教你自動發(fā)送短信(不想回復(fù)工作郵件妙招),目前在國內(nèi)通過手機短信保障信息安全是比較常見的,具體實例代碼大家跟隨小編一起通過本文學(xué)習(xí)吧2018-10-10
python通過imaplib模塊讀取gmail里郵件的方法
這篇文章主要介紹了python通過imaplib模塊讀取gmail里郵件的方法,涉及Python操作imaplib模塊操作郵件的相關(guān)技巧,需要的朋友可以參考下2015-05-05

