NoneType对象没有属性'write'

问题描述 投票:0回答:1

我有一个Python程序,该程序打开串行端口COM4以发送一些命令。我正在以如下方式修改它:打开串行端口COM4时,我想打开串行端口COM5一段时间并发送一些命令。我有一个名为serialChannel的pyserial对象,它对端口COM4进行所有操作,并且按预期方式工作。我创建了另一个Pyserial对象serialChannel5(在comms类下的comms.py文件中的serialChannel对象的下面声明),如下所示:

 # 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等),则程序会给我一个错误: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' object has no attribute 'write'; (in sndcmd5)

sndcmd5等于sndcmd的COM5

给我一个错误的代码:

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一起位于comms文件中。snd_rcv / snd_rcv5在另一个名为控制器的文件中,>

我有一个Python程序,该程序打开串行端口COM4以发送一些命令。我正在以如下方式修改它:打开串行端口COM4时,我想打开串行端口COM5一段时间,然后发送...

python pyserial
1个回答
0
投票

愚蠢的我,我没有定义对象控件,而是在主脚本中使用了它。现在通过在脚本中定义“控件”来解决]

© www.soinside.com 2019 - 2024. All rights reserved.