我设置了一个简单的Python脚本,用于将字符发送到COM3上的设备。 (这在Windows XP上运行) 设备接收字符很好,但是当脚本结束时,或者我打电话
ser.close() #ser is an instance of the `serial` method `Serial`
它将串行端口上的DTR线设置为高,重置我的设备。
对此感到困惑,我在PySerial文档(http://pyserial.sourceforge.net/)中查了一下,发现模块有一个__del__
方法,当删除Serial实例时调用ser.close()
函数
是否有覆盖此__del__
方法?
(我不希望断开设备的重置线与DTR线的连接)
以下是我使用的基本代码:
import serial
ser = serial.Serial()
ser.port = 2 #actually COM3
ser.baudrate = 9600
ser.open()
ser.write("Hello")
ser.close()
答案 0 :(得分:3)
当然,继续并覆盖它。您可以创建Serial
的子类并指定无操作__del__()
方法并使用子类而不是Serial
,或者从实际的Serial
类中删除该方法(使用del
语句进行猴子修补。前一种方法是首选方法,但如果您没有任何控制权的代码使用串行端口,则可能需要使用第二种方法。当然,请确保__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()
。 : - )
答案 1 :(得分:2)
你尝试过这样的事吗?
MySerial = serial.Serial
def dummy_del(obj):
pass
MySerial.__del__ = dummy_del
ser = MySerial()