Объект NoneType не имеет атрибута «запись» - PullRequest
0 голосов
/ 06 марта 2020

У меня есть программа Python, которая открывает последовательный порт COM4 для отправки нескольких команд. Я изменяю его таким образом, чтобы, когда последовательный порт COM4 открыт, я хочу на некоторое время открыть последовательный порт COM5 и отправить несколько команд. У меня есть объект pyserial с именем serialChannel, который выполняет все операции для порта COM4, ​​и он работает, как ожидалось. Я создал еще один объект Pyserial serialChannel5 (объявленный чуть ниже объекта serialChannel в файле comms.py в классе comms), например:

 # Constructor
    def __init__(self):
        # Class attributes
        self.serialChannel = None  #Pyserial obj
        self.serialChannel5 = None
        self.command = None
        self.loggingOn = False
        self.device = None

Вот что делает моя программа:

def myscr(control, log):
    mycomms = comms.comms()
    comms.serialOpen(logging=False)
    control.snd_rcv(defines.command1)
    comms.serialClose()

И эта программа не работает:

def myscr(control, log):
    mycomms = comms.comms()
    comms.serialOpen5(logging=False)
    control.snd_rcv5(defines.command1)
    comms.serialClose5()

Если я просто использую свои оригинальные функции, команда «command1» отправляется на порт 4 без проблем. Но если я использую связанные с портом 5 функции (имена функций с суффиксом 5 в конце, как указано выше - например, serialOpen5, snd_rcv5 et c), программа выдает ошибку:

Объект NoneType не имеет атрибута напишите

Это мои связанные функции для последовательного COM4. Просьба учесть, что все функции для последовательного интерфейса 5 просто реплицируются следующим образом:

def serialOpen(self, port=None, logging=None):
    iport.device = COM4
    self.device = iport.device

    self.serialChannel = serial.Serial(
            port=self.device,
            baudrate=self.DEFAULT_BAUD,
            parity=self.DEFAULT_PARITY,
            stopbits=self.DEFAULT_STOPBITS,
            bytesize=self.DEFAULT_DATABITS,
            timeout=self.READ_TIMEOUT,
            write_timeout=self.WRITE_TIMEOUT
        )
        self.serialChannel.isOpen()
        self.serialChannel.flushInput()
        self.serialChannel.flushOutput()



def snd_rcv(self, cmd, logging=True,):
    try:
        res = self.comms.sndcmd(cmd)
        return res

def sndcmd(self, command)
    self.Tx(self.command)
    self.serialChannel.flushInput()

def Tx(self, cmd):
    self.serialChannel.write(cmd.encode())
    return True

Вся вышеприведенная последовательность работает для COM и отправляет команду через COM4. Когда я копирую эти функции для COM5, он выдает ошибку:

Объект 'NoneType' не имеет атрибута 'write'; (в sndcmd5) sndcmd5 является COM5 эквивалентным sndcmd

Код, который выдает ошибку:

def serialOpen5(self, port=None, logging=None):
    iport.device = COM5
    self.device = iport.device

    self.serialChannel5 = serial.Serial(
            port=self.device,
            baudrate=self.DEFAULT_BAUD,
            parity=self.DEFAULT_PARITY,
            stopbits=self.DEFAULT_STOPBITS,
            bytesize=self.DEFAULT_DATABITS,
            timeout=self.READ_TIMEOUT,
            write_timeout=self.WRITE_TIMEOUT
        )
        self.serialChannel5.isOpen()
        self.serialChannel5.flushInput()
        self.serialChannel5.flushOutput()



def snd_rcv5(self, cmd, logging=True,):
    try:
        res = self.comms.sndcmd5(cmd)
        return res

def sndcmd5(self, command)
    self.Tx5(self.command)
    self.serialChannel5.flushInput()

def Tx5(self, cmd):
    self.serialChannel5.write(cmd.encode())
    return True

Не могли бы некоторые помочь мне выяснить, что я делаю неправильно?

Сценарий с функцией myscr находится в основном файле сценария. def __init __ находится в файле связи вместе с функциями serialOpen / serialOpen5, sndcmd / sndcmd5, Tx / Tx5 . snd_rcv / snd_rcv5 находится в другом файле с именем controller,

1 Ответ

0 голосов
/ 06 марта 2020

Глупо, я не определил объект управления, но использовал его в основном скрипте. Исправлено теперь путем определения «управления» в скрипте

...