Virtual Serial Device in Python? Virtual Serial Device in Python? python python

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.