从Object内部调用时,Python Serial readline不起作用

时间:2015-02-09 21:21:23

标签: python serial-port

所以我正在为pyserial的安捷伦电源编写一个简单的串行驱动程序。一切正常,直到我把它打包成一个类,并尝试从我创建的对象中运行一些简单的串行写/读。

该类的代码段:

class agilent:
    """
    Class for controlling the chroma class power supplies
    Basically a wrapper around the serial interface to the chromas
    """

    def __init__(self, port_name="/dev/ttyUSB0", baud_rate=9600):
        self.ser = serial.Serial(port=port_name, baudrate=9600, bytesize=8, parity=serial.PARITY_NONE, stopbits=2, dsrdtr=1, timeout=5)
        self.reset()
        self.identify() #Calls the IDN function to see if this is a multi-service device
        print("Connected to: " + self.idn)
        if self.multi_service:
            print("This is a multi-service device, please make sure to specify one of: P25V, P25N, or P6V when setting limits")

    def reset(self):
        """
        Reset the agilent power supply to a reasonable(safe) settings
        """
        self.ser.write("*CLS\n")  # Clear any errors on the chroma
        self.ser.write("system:remote\n")  # set the controls back to remote

    def identify(self):
        self.ser.write('*IDN?\n')
        self.idn = self.ser.readline()
        if 'E3631' in self.idn:
            self.multi_service=True
        else:
            self.multi_service=False

        return self.idn

当我从__init __()函数调用identify()函数时,readline()超时并返回一个空字符串。

当在ipython中运行并导入类并创建一个对象时,我可以在对象上手动调用identify函数并且它工作得很好....所以要么我在做类方法或者一些有趣的业务做错了继续使用序列类。 我知道正确的函数是用正确的上下文调用的,因为如果我放了一个

print(self.ser.port)

在识别功能中,它返回正确的实例信息。

有什么想法吗?

典型的运行看起来像这样:

from agilent_ps_controller import agilent
remote_ps = agilent() # << This hangs until the readline in __init__() times-out
remote_ps.reset()  # Serial message is correctly written on wire
remote_ps.identify() # << this works just fine! Why didn't it work when the object constructor calls it?
remote_ps.__init__() # << this also times-out the readline.

1 个答案:

答案 0 :(得分:1)

我确实遇到了同样的问题。事实证明,pyserial的readline()使用\n作为默认的eol字符。如果您的设备使用其他内容,例如\r\neol(例如Arduino&#39; s println()),则可能是问题所在。

所以,简而言之,请尝试以这种方式致电readline()

self.ser.readline(eol=b'\r\n')

或您的设备使用的任何其他eol个字符。