簡體   English   中英

Python-can - can.Logger 監聽器問題

[英]Python-can - can.Logger Listener Issue

Python-can package 中的 can.Logger 偵聽器似乎沒有將數據記錄到文件中。

我知道有 CAN 總線數據,因為 can.Printer() 偵聽器正在運行,它將 CAN 流量打印到 output 終端。 can.Logger 偵聽器似乎確實在目錄中創建了 .asc 或 .blf 文件(文件arg 中的文件類型是什么,它都會創建該文件),但它不會向其中寫入任何信息。

我認為它可能是模式arg,但從 'w' 或 'a' 等更改它似乎並沒有什么不同。

知道為什么會發生這種情況嗎?

我正在使用 Python 3.8.3、PyCharm 2020.1.2 社區版、Windows 10

def bus_log():
    bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
    logger = can.Logger('bus_log.asc', 'w')
    notifier = can.Notifier(bus, [can.Printer(), logger])

    try:
        while True:
            time.sleep(0.001)
    except KeyboardInterrupt:
        bus.shutdown()
        notifier.stop()


if __name__ == "__main__":
    bus_log()

編輯 1:在重新排列代碼和一些試驗和錯誤之后,Try-Except 塊似乎是問題所在。 我仍然不明白為什么它不起作用。 但我懷疑這與 PyCharm 的鍵盤中斷功能有關。 在我的原始代碼中,我希望 KeyboardInterrupt 會發生,當它發生時,我會關閉總線和通知程序。 但是我的理論是這沒有發生,所以我的文件沒有關閉。 這是我的新代碼有效:

def bus_log():
    bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
    logger = can.Logger('bus_log.asc', 'a')
    notifier = can.Notifier(bus, [can.Printer(), logger])

    time_1 = time.perf_counter()
    while True:
        time_2 = time.perf_counter()
        if time_2 >= time_1 + 5:
            notifier.stop()
            bus.shutdown()
        return


if __name__ == "__main__":
    bus_log()

問題源於 Pycharm 在選擇停止按鈕時不發送鍵盤中斷 (CTRL - C) 命令,腳本只是停止。 此外(CTRL-F2)又名停止按鈕與 CTRL-C 不同。 這現在可能看起來很明顯,但我在一天的大部分時間里都逃脫了。

解決方案:

導航到運行 > 編輯配置 > Select在 output 控制台中模擬終端

從那里鍵盤中斷功能(CTRL-C)將起作用。 從那時起,我的腳本將正確終止通知器、偵聽器和總線,從而保存日志文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM