2010-02-01 1 views
5

Ho un programma che utilizza pyserial e voglio testarlo senza usare un vero dispositivo con porta seriale.come usare/dev/ptmx per creare una porta seriale virtuale?

In Windows, utilizzo com0com e, in linux, so che esiste un metodo per creare una coppia di porte seriali virtuali senza utilizzare un programma aggiuntivo.

quindi guardo il manuale e ho trovato pts,/dev/ptmx, ma non so come creare un paio seguendo il manuale, qualcuno può darmi un esempio?

ho provato (in python):

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

e funziona,/dev/pts/4 è stato creato.

e ho provato:

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

e il risultato è:

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

edit: ho trovato una soluzione (workround), utilizzando socat.

socat PTY,link=COM8 PTY,link=COM9 

quindi COM8 COM9 vengono creati come coppie di porte seriali virtuali.

risposta

2

Per the docs, è necessario ptsname per ottenere il nome dello slave lato dello pseudo-terminale, e anche, citando i documenti,

Prima di aprire il pseudo-terminale Slave, è necessario passare il file master del descrittore a grantpt (3) e unlockpt (3).

Dovresti essere in grado di utilizzare ctypes per chiamare tutte le funzioni necessarie.

+1

c'è qualche esempio? C/Python/C++? – linjunhalida

+0

Ho trovato un lungo esempio C, http://www.developerweb.net/forum/showthread.php?t=5623, ma nessun esempio di Python. –

+2

Gli esempi di Python sono nascosti nel modulo 'pty', sebbene lasci che' os.openpty' faccia il lavoro effettivo quando può :) –

0

Non conosco Python ma posso indicarti la giusta direzione: guarda here ad un esempio di codice C. Ecco la pagina man per/dev/ptmx. Assicurati che le autorizzazioni e il proprietario siano corretti! Ecco il poster sulle LinuxQuestions forum su come utilizzarlo da C.

Spero che questo aiuti, i migliori saluti, Tom.

0

Si consiglia di utilizzare invece il modulo pty, che dovrebbe occuparsi di questo per voi. (apre/dev/ptmx o chiama lo openpty o apre un altro dispositivo appropriato, a seconda della piattaforma.)

0

È possibile creare un oggetto fittizio che implementa la stessa interfaccia delle classi pySerial utilizzate, ma fare qualcosa di completamente diverso e facilmente replicabile come leggere e scrivere su file/terminale/ecc.

Ad esempio:

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 

Se si fa qua qua come un'anatra e anatre come un'anatra ...

+0

ancora un'altra soluzione ... illuminante. – linjunhalida

4

Stavo cercando di creare un'applicazione che facesse uso di porte seriali virtuali per comunicare con alcuni dispositivi remoti usando la conversione TCP/seriale ... e mi sono imbattuto in un problema simile al tuo. La mia soluzione ha funzionato come segue:

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) 

Anche se il nome della porta del master è lo stesso se si controlla (/ dev/ptmx) fd è diversa se si crea un altro maestro, coppia di slave, così la lettura dal master ti dà il messaggio inviato al suo schiavo assegnato. Spero che questo aiuti voi o chiunque altro che si imbatte in un problema simile a questo.

+0

dovresti prendere in considerazione l'utilizzo di una sostituzione di pyserial: [pytty] (http://hg.pytty.org/pytty/file/9ecd879bcd15/src/__init__.py#l41) che offre un modo per gestire la parte master e parte schiava. – zmo

+0

Grazie. Questo era proprio quello di cui avevo bisogno per simulare un'interfaccia seriale per i test. –