【问题标题】:Do I have to close a pySerial connection explicitly?我是否必须明确关闭 pySerial 连接?
【发布时间】:2021-05-11 13:30:30
【问题描述】:

我编写了这个连接到继电器板的类,并允许我发送命令来关闭和打开它上面的不同继电器。

class relay_board:
    def __init__(self, com_port):
        self.com_port = com_port
        self.ser = serial.Serial(self.com_port, 9600, timeout=2)

        self.shorttime = 0.01

    def send_command(self, bank, ports):
        self.bank = bank
        self.ports = ports

        message = bank+ports

        self.ser.write(message)
        time.sleep(0.01)

我这样称呼它,

relay_one = relay_board.relay_board('COM3')

relay_one.send_command(b'\x42', b'\x00')
relay_one.send_command(b'\x43', b'\x3F')

程序完成后该类是否会销毁 self.ser,还是我必须添加 __del__def close_serial() 函数才能在最后关闭串行连接?

【问题讨论】:

    标签: python pyserial


    【解决方案1】:

    Serial 对象 has a __del__ method 做你想做的事,所以你不需要写它。

    话虽如此,你不应该依赖被调用的__del__。出于与you shouldn't leave files opened 相同的原因,您不应依赖垃圾收集器为您关闭事物。事实上,在解释器关闭期间,没有理由垃圾收集您的对象,因为操作系统无论如何都会回收此内存,因此 CPython 以外的实现并不会真正打扰。这样做的原因是这些对象持有操作系统资源的句柄,这些对象在程序关闭时可能不会关闭。

    所以,为了确保句柄被正确释放,你应该自己close()串口,而不是等待解释器关闭来为你做。

    【讨论】:

    • 感谢您的解释,现在更有意义了。如果是 init 函数,我实际上已经将串行初始化移出并将其放在 get 命令函数中。我还使用with as 运行它,所以我认为它应该正确关闭。我也在最后运行 close() 以确保双重确定。
    • 所以你在不发送命令的同时保持端口关闭?我不确定串行端口中的缓冲究竟是如何工作的,但如果目标设备发回任何东西而你没有读取它,那么它可能会填满设备到计算机的缓冲区,这会使设备在等待时被软锁定您可以阅读它发送给您的所有数据。我曾经用 Arduino 遇到过这个问题,但我不记得具体细节了。
    • 是的,我保持关闭状态,我目前使用的设备没问题,因为它无法通过串行发送任何内容。它是一个仅接受命令的中继板,因此在这里不是问题。不过,这是一个有效的观点,我将在未来密切关注。
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2013-11-25
    • 2017-05-12
    相关资源
    最近更新 更多