繁体   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