1

我设置了一个简单的 Python 脚本来将字符发送到 COM3 上的设备。(这是在 Windows XP 上运行的)设备可以正常接收字符,但是当脚本结束时,或者我调用

ser.close()      #ser is an instance of the `serial` method `Serial`

它将串行端口上的 DTR 线设置为高电平,重置我的设备。

对此感到困惑,我在 PySerial 文档(http://pyserial.sourceforge.net/)中四处寻找,发现 Module 有一个方法,该方法在删除 Serial 实例时__del__调用该函数。ser.close()

反正有覆盖这个__del__方法吗?

(我宁愿不必从 DTR 线断开我设备的重置线)

以下是我正在使用的基本代码:

import serial
ser = serial.Serial()
ser.port = 2      #actually COM3
ser.baudrate = 9600
ser.open()
ser.write("Hello")
ser.close()
4

2 回答 2

3

当然,继续并覆盖它。您可以创建一个子类Serial并指定一个无操作__del__()方法并使用子类代替,或者使用该语句从实际类(猴子补丁)中Serial删除该方法。前一种方法是首选,但如果您无法控制的代码正在使用串行端口,则第二种方法可能是必要的。当然,在覆盖它之前,请确保该方法没有做任何其他重要的事情。Serialdel__del__()

子类化:

import serial

class mySerial(serial.Serial):
    def __del__(self):
        pass

ser = mySerial()
# rest of script the same

猴子补丁:

import serial

del serial.Serial.__del__

如果你有这个模块的 Python 源代码(即它不是用 C 编写的),第三种方法是创建你自己的副本,然后编辑它而不这样做。(您也可以对 C 模块执行此操作,但如果您没有 C 专业知识,则运行它会有点困难。)

当然,将__del__()方法更改为不调用ser.close()不会对您提供的代码有太大帮助,因为您正在调用ser.close()自己。:-)

于 2011-04-25T17:25:46.693 回答
2

你有没有尝试过这样的事情?

MySerial = serial.Serial

def dummy_del(obj):
    pass

MySerial.__del__ = dummy_del

ser = MySerial()
于 2011-04-25T17:27:30.220 回答