python serial-port pyserial virtual-serial-port

Dispositivo de serie virtual en Python?



serial-port pyserial (6)

Tal vez un dispositivo de bucle hará el trabajo si necesita probar su aplicación sin acceso a un dispositivo. Está incluido en pySerial 2.5 https://pythonhosted.org/pyserial/url_handlers.html#loop

Sé que puedo usar, por ejemplo, pySerial para hablar con dispositivos en serie, pero ¿qué sucede si no tengo un dispositivo ahora mismo pero aún necesito escribir un cliente para él? ¿Cómo puedo escribir un "dispositivo serial virtual" en Python y hacer que pySerial hable con él, como diría, por ejemplo, ejecutar un servidor web local? Quizás no estoy buscando bien, pero no he podido encontrar ninguna información sobre este tema.


Puede ser más fácil usar algo como com0com (si está en Windows) para configurar un puerto serial virtual y desarrollarlo.


esto es algo que hice y funcionó para mí hasta ahora:

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)

Si crea más puertos virtuales, no tendrá problemas ya que los diferentes maestros obtienen descripciones de archivos diferentes, incluso si tienen el mismo nombre.


Si está ejecutando Linux, puede usar el comando socat para esto, así:

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

Cuando se ejecuta el comando, le informará qué puertos serie ha creado. En mi máquina, esto se ve así:

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]

Ahora puedo escribir en /dev/pts/13 y recibir en /dev/pts/12 , y viceversa.


Depende un poco de lo que estás tratando de lograr ahora ...

Podría ajustar el acceso al puerto serie en una clase y escribir una implementación para usar E / S de socket o E / S de archivos. Luego, escriba su clase de E / S en serie para usar la misma interfaz y conéctela cuando el dispositivo esté disponible. (Este es realmente un buen diseño para probar la funcionalidad sin requerir hardware externo).

O bien, si va a utilizar el puerto serie para una interfaz de línea de comando, puede usar stdin / stdout.

O bien, hay otra respuesta sobre dispositivos seriales virtuales para Linux .


Pude emular un puerto serial arbitrario ./foo usando este código:

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 necesario sudo apt-get install socat ( sudo apt-get install socat ), así como también el paquete pyserial python ( pip install pyserial ).

Abra el intérprete de python e importe SerialEmulator:

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

Su programa de cliente puede envolver ./ttyclient con pyserial, creando el puerto serie virtual. También puede hacer client_port /dev/ttyUSB0 o similar si no puede modificar el código del cliente, pero podría necesitar sudo .

También tenga en cuenta este problema: Pyserial no funciona bien con el puerto virtual