0

Python-can 包中的 can.Logger 侦听器似乎没有将数据记录到文件中。

我知道有 CAN 总线数据,因为 can.Printer() 侦听器正在运行,它将 CAN 流量打印到输出终端。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()
4

1 回答 1

0

该问题源于Pycharm在选择停止按钮时不会发送键盘间断(CTRL -C)命令,脚本只是停止。此外(CTRL-F2)又名停止按钮与 CTRL-C 不同。这现在可能看起来很明显,但我在一天的大部分时间里都逃脱了。

解决方案:

导航到运行 > 编辑配置 >在输出控制台中 选择 模拟终端

从那里键盘中断功能(CTRL-C)将起作用。从那时起,我的脚本将正确终止通知器、侦听器和总线,从而保存日志文件。

于 2020-06-23T02:29:56.870 回答