class SerialDevice(): process = None def __init__(self, port, prompt): self.port = port self.prompt = prompt def open(self): self.process = PopenSpawn( f'{sys.executable} -m pexpect_serial_terminal -p {self.port}') self.process.logfile_read = open("serial_log.txt", "ab+") self.process.sendline('') i = self.process.expect([r'.+ login:'******'ubuntu') self.process.expect('Password:'******'ubuntu') self.process.expect(self.prompt) elif i == 2: self.close() raise ValueError('cannot log in serial device!') def close(self): self.process.write('\x03') self.process.wait() def run(self, command, timeout=3): self.process.sendline(command) self.process.expect(self.prompt, timeout=timeout) output = self.process.before.decode('utf-8') print('\n<serial output>\ncommand:', output) return output
class ProcessIO(IO): def __init__(self): IO.__init__(self) self.proc = None self.buffer_size = 1 def __del__(self): if self.proc is not None: self.proc.kill(signal.CTRL_BREAK_EVENT) def run(self, exe): #self.proc = Popen([exe], stdout=PIPE, stdin=PIPE, bufsize=self.buffer_size, shell=True) self.proc = PopenSpawn(exe) def send(self, s): #self.proc.stdin.write(s) self.proc.write(s) def recv(self, size): #return self.proc.stdout.read(size) return self.proc.read(size) def recvuntil(self, pred): self.proc.expect(pred) return self.proc.before