Frage Virtuelles serielles Gerät in Python?


Ich weiß, dass ich z.B. pySerial, um mit seriellen Geräten zu sprechen, aber was, wenn ich gerade kein Gerät habe, aber trotzdem einen Client dafür schreiben muss? Wie kann ich ein "virtuelles serielles Gerät" in Python schreiben und pySerial damit sprechen lassen, als würde ich beispielsweise einen lokalen Webserver betreiben? Vielleicht suche ich einfach nicht gut, aber ich konnte keine Informationen zu diesem Thema finden.


30
2018-02-18 19:59


Ursprung


Antworten:


das habe ich bisher gemacht und ausgearbeitet:

import os, pty, serial

master, slave = pty.openpty()
s_name = os.ttyname(slave)

ser = serial.Serial(s_name)

# To Write to the device
ser.write('Your text')

# To read from the device
os.read(master,1000)

Wenn Sie mehr virtuelle Ports erstellen, haben Sie keine Probleme, da die verschiedenen Master unterschiedliche Dateideskriptoren erhalten, auch wenn sie denselben Namen haben.


27
2018-02-26 17:29



Es kann einfacher sein, etwas wie zu verwenden com0com (wenn Sie unter Windows sind), um einen virtuellen seriellen Port einzurichten und darauf aufzubauen.


5
2018-02-18 20:14



Es hängt ein bisschen davon ab, was du gerade erreichen willst ...

Sie können den Zugriff auf den seriellen Port in einer Klasse umbrechen und eine Implementierung schreiben, um Socket-E / A oder Datei-E / A zu verwenden. Schreiben Sie dann Ihre serielle I / O-Klasse, um dieselbe Schnittstelle zu verwenden, und schließen Sie sie an, wenn das Gerät verfügbar ist. (Dies ist ein gutes Design zum Testen der Funktionalität, ohne dass externe Hardware benötigt wird.)

Wenn Sie den seriellen Port für eine Befehlszeilenschnittstelle verwenden möchten, können Sie stdin / stdout verwenden.

Oder, da ist diese andere Antwort virtuelle serielle Geräte für Linux.


4
2018-02-18 21:05



Ich konnte eine beliebige serielle Schnittstelle emulieren ./foo mit diesem 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 muss installiert werden (sudo apt-get install socat), ebenso wie pyserial Python-Paket (pip install pyserial).

Öffne den Python Interpreter und importiere SerialEmulator:

>>> from SerialEmulator import SerialEmulator
>>> emulator = SerialEmulator('./ttydevice','./ttyclient') 
>>> emulator.write('foo')
>>> emulator.read()

Ihr Client-Programm kann dann umbrechen ./ttyclient mit Pyserial, Erstellen der virtuellen seriellen Schnittstelle. Sie könnten auch client_port erstellen /dev/ttyUSB0 oder Ähnliches, wenn Sie den Client-Code nicht ändern können, aber möglicherweise benötigen sudo.

Beachten Sie auch dieses Problem: Pyserial spielt nicht gut mit dem virtuellen Port


3
2018-05-26 02:03



Wenn Sie Linux verwenden, können Sie die Socat Befehl dafür, so:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

Wenn der Befehl ausgeführt wird, informiert er Sie darüber, welche seriellen Ports er erstellt hat. Auf meiner Maschine sieht das so aus:

2014/04/23 15:47:49 socat[31711] N PTY is /dev/pts/12
2014/04/23 15:47:49 socat[31711] N PTY is /dev/pts/13
2014/04/23 15:47:49 socat[31711] N starting data transfer loop with FDs [3,3] and [5,5]

Jetzt kann ich schreiben /dev/pts/13 und erhalten auf /dev/pts/12, und umgekehrt.


2
2018-04-23 20:55



Vielleicht erledigt ein Loop-Gerät die Aufgabe, wenn Sie Ihre Anwendung ohne Zugriff auf ein Gerät testen müssen. Es ist in pySerial 2.5 enthalten https://pythonhosted.org/pyserial/url_handlers.html#loop 


2
2018-02-18 18:53