Virtual Serial Device in Python?
this is something I did and worked out for me so far:
import os, pty, serialmaster, slave = pty.openpty()s_name = os.ttyname(slave)ser = serial.Serial(s_name)# To Write to the deviceser.write('Your text')# To read from the deviceos.read(master,1000)
If you create more virtual ports you will have no problems as the different masters get different file descriptors even if they have the same name.
I was able to emulate an arbitrary serial port ./foo
using this code:
SerialEmulator.py
import os, subprocess, serial, time# this script lets you emulate a serial device# the client program should use the serial port file specifed by client_port# if the port is a location that the user can't access (ex: /dev/ttyUSB0 often),# sudo is requiredclass SerialEmulator(object): def __init__(self, device_port='./ttydevice', client_port='./ttyclient'): self.device_port = device_port self.client_port = client_port cmd=['/usr/bin/socat','-d','-d','PTY,link=%s,raw,echo=0' % self.device_port, 'PTY,link=%s,raw,echo=0' % self.client_port] self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) time.sleep(1) self.serial = serial.Serial(self.device_port, 9600, rtscts=True, dsrdtr=True) self.err = '' self.out = '' def write(self, out): self.serial.write(out) def read(self): line = '' while self.serial.inWaiting() > 0: line += self.serial.read(1) print line def __del__(self): self.stop() def stop(self): self.proc.kill() self.out, self.err = self.proc.communicate()
socat
needs to be installed (sudo apt-get install socat
), as well as the pyserial
python package (pip install pyserial
).
Open the python interpreter and import SerialEmulator:
>>> from SerialEmulator import SerialEmulator>>> emulator = SerialEmulator('./ttydevice','./ttyclient') >>> emulator.write('foo')>>> emulator.read()
Your client program can then wrap ./ttyclient
with pyserial, creating the virtual serial port. You could also make client_port /dev/ttyUSB0
or similar if you can't modify client code, but might need sudo
.
Also be aware of this issue: Pyserial does not play well with virtual port
It may be easier to using something like com0com (if you're on Windows) to set up a virtual serial port, and develop on that.