serie serial raspberry puertos puerto leer lectura configurar comunicacion python linux serial-port

python - raspberry - cómo usar/dev/ptmx para crear un puerto serial virtual?



python leer puerto serial (5)

Debería considerar usar el módulo pty , que debería ocuparse de esto por usted. (abre / dev / ptmx o llama a openpty o abre otro dispositivo apropiado, dependiendo de la plataforma).

Tengo un programa, usando pyserial, y quiero probarlo sin usar un dispositivo de puerto serie real.

En Windows, uso com0com, y en Linux, sé que hay un método para crear un par de puerto serie virtual sin usar un programa adicional.

entonces busco el manual, y encontré pts, / dev / ptmx, pero no sé cómo crear un par siguiendo el manual, ¿alguien me puede dar un ejemplo?

Lo intenté (en python):

f = open("/dev/ptmx", "r")

y funciona, se crea / dev / pts / 4.

y lo intenté:

f = open("/dev/4", "w")

y el resultado es:

Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 5] Input/output error: ''/dev/pts/4''

editar: Encontré una solución (workround), usando socat.

socat PTY,link=COM8 PTY,link=COM9

luego COM8 COM9 se crean como par de puerto serie virtual.


No conozco Python, pero puedo indicarle la dirección correcta: mire aquí una muestra de código C. Aquí está la página del manual para / dev / ptmx. ¡Asegúrate de que los permisos y el propietario sean correctos !. Aquí está el cartel en el foro de linuxquestions sobre cómo usarlo de C.

Espero que esto ayude, Saludos, Tom.


Puedes construir un objeto ficticio que implemente la misma interfaz que las clases pySerial que usas, pero haz algo completamente diferente y fácilmente replicable, como leer y escribir en archivos / terminal / etc.

Por ejemplo:

class DummySerial(): #you should consider subclassing this def __init__(self, *args, **kwargs): self.fIn = open("input.raw", ''r'') self.fOut = open("output.raw", ''w'') pass def read(self, bytes = 1): return self.fIn.read(bytes) def write(self, data): self.fOut.write(data) def close(self): self.fIn.close() self.fOut.close() #implement more methods here

Si grazna como un pato y se agacha como un pato ...


Según los documentos , necesita ptsname para obtener el nombre del lado esclavo del pseudo-terminal, y también, citando los documentos,

Antes de abrir el esclavo pseudo-terminal, debe pasar el descriptor de archivo del maestro para otorgar (3) y desbloquear (3).

Debería poder usar ctypes para llamar a todas las funciones necesarias.


Intentaba hacer una aplicación que hiciera uso de puertos seriales virtuales para comunicarme con algunos dispositivos remotos usando la conversión TCP / Serial ... y me encontré con un problema similar al suyo. Mi solución funcionó de la siguiente manera:

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)

Aunque el nombre del puerto del maestro es el mismo si marca (/ dev / ptmx), el fd es diferente si crea otro par maestro, esclavo, por lo que al leer del maestro obtiene el mensaje emitido a su esclavo asignado. Espero que esto lo ayude a usted o a cualquier otra persona que se encuentre con un problema similar a este.