所以我正在为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.
答案 0 :(得分:1)
我确实遇到了同样的问题。事实证明,pyserial的readline()使用\n
作为默认的eol
字符。如果您的设备使用其他内容,例如\r\n
为eol
(例如Arduino&#39; s println()
),则可能是问题所在。
所以,简而言之,请尝试以这种方式致电readline()
:
self.ser.readline(eol=b'\r\n')
或您的设备使用的任何其他eol
个字符。