У меня есть простой Python script, настроенный для отправки символов на устройство на COM3. (Это работает в Windows XP) Устройство получает символы "отлично", но когда заканчивается script, или я вызываю
ser.close() #ser is an instance of the `serial` method `Serial`
Он устанавливает линию DTR на последовательном порту High, перезагружая мое устройство.
Запутанный этим, я ткнул в PySerial Documentation (http://pyserial.sourceforge.net/) и обнаружил, что модуль имеет метод __del__
который вызывает функцию ser.close()
при удалении экземпляра Serial.
Есть ли способ переопределить этот метод __del__
?
(Я бы предпочел не отсоединять строку Reset моего устройства от линии DTR)
Ниже приведен базовый код, который я использую:
import serial
ser = serial.Serial()
ser.port = 2 #actually COM3
ser.baudrate = 9600
ser.open()
ser.write("Hello")
ser.close()
Конечно, продолжайте и переопределите его. Вы можете создать подкласс Serial
и указать метод do-nothing __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()
самостоятельно.: -)
Вы пробовали что-то вроде этого?
MySerial = serial.Serial
def dummy_del(obj):
pass
MySerial.__del__ = dummy_del
ser = MySerial()
ser.close
.set_DTR
функциюset_DTR
, и теперь все работает. Спасибо за помощь!