Virtual Serial Device in Python?

后端 未结 6 1192
粉色の甜心
粉色の甜心 2020-12-12 14:58

I know that I can use e.g. pySerial to talk to serial devices, but what if I don\'t have a device right now but still need to write a client for it? How can I write a \"virt

6条回答
  •  半阙折子戏
    2020-12-12 15:41

    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 required
    
    class 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

提交回复
热议问题