2010-02-01 3 views
5

Ich habe ein Programm, mit Pyserial, und ich möchte es testen, ohne eine echte serielle Schnittstelle zu verwenden.Wie benutzt man/dev/ptmx um einen virtuellen seriellen Port zu erstellen?

In Windows verwende ich com0com, und in Linux, ich weiß, es gibt eine Methode, um virtuelle serielle Schnittstelle ohne zusätzliches Programm zu erstellen.

Also schaue ich das Handbuch nach, und finde pts,/dev/ptmx, aber ich weiß nicht, wie man ein Paar erstellt, indem ich dem Handbuch folge, kann mir jemand ein Beispiel geben?

Ich habe versucht (in Python):

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

und es funktioniert,/dev/pts/4 erstellt wird.

und ich versuchte:

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

und das Ergebnis ist:

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

edit: fand ich eine Lösung (workround), socat verwenden.

dann COM8 COM9 als virtuelle serielle Schnittstelle erstellt werden.

Antwort

2

Per the docs Sie ptsname müssen Sie den Namen der Slave-Seite des Pseudo-Terminal zu erhalten, und auch die Dokumentation zu zitieren,

Vor dem Pseudo-Terminal Slave öffnen, müssen Sie passieren die Datei des Masters Descriptor zu grantpt (3) und unlockpt (3).

Sie sollten ctypes verwenden können, um alle benötigten Funktionen aufzurufen.

+1

gibt es ein Beispiel? C/python/C++? – linjunhalida

+0

Ich fand ein langes C-Beispiel, http://www.developerweb.net/forum/showthread.php?t=5623, aber keine Python-Beispiele. –

+2

Python-Beispiele sind im 'pty'-Modul versteckt, obwohl es' os.openpty' bequem erlaubt, die eigentliche Arbeit zu machen, wenn es möglich ist :) –

0

Ich weiß nicht Python, aber ich kann Sie in die richtige Richtung zeigen: Schauen Sie here bei einem C-Code-Beispiel. Hier ist die man Seite für die/dev/ptmx. Stellen Sie sicher, dass die Berechtigungen und der Besitzer korrekt sind! Hier ist das Plakat auf dem linuxquestions forum, wie man es von C. verwenden

hoffte, das hilft, Mit freundlichen Grüßen, Tom.

0

Sie sollten stattdessen das pty Modul in Erwägung ziehen, das sollte dies für Sie erledigen. (Es öffnet/dev/ptmx oder ruft openpty oder öffnet ein anderes geeignetes Gerät, je nach Plattform.)

0

Sie könnten ein Dummy-Objekt erstellen, die die gleiche Schnittstelle wie die pySerial Klassen implementiert die Sie verwenden, sondern etwas ganz anderes machen und leicht replizierbar wie Lesen und Schreiben in Dateien/Terminal/etc.

Zum Beispiel:

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 

Wenn es wie eine Ente quakt und Enten wie eine Ente ...

+0

noch eine andere Lösung ... aufschlussreich. – linjunhalida

4

Ich habe versucht, eine Anwendung zu erstellen, die virtuelle serielle Anschlüsse verwendet, um mit einigen Remote-Geräten mit TCP/Seriell-Konvertierung zu kommunizieren ... und ich stieß auf ein Problem ähnlich dem Ihren. Meine Lösung war wie folgt:

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) 

Obwohl der Name des Hafens des Masters ist das gleiche, wenn Sie überprüfen (/ dev/ptmx) der fd anders, wenn Sie einen anderen Master, Paar Slave schaffen, so lesen Vom Master erhältst du die Nachricht an seinen zugewiesenen Slave. Ich hoffe, das hilft dir oder anderen, die auf ein ähnliches Problem stoßen.

+0

sollten Sie in Erwägung ziehen, einen Ersatz für pyserial zu verwenden: [petty] (http://hg.pytty.org/pytty/file/9ecd879bcd15/src/__init__.py#l41), die eine Möglichkeit bieten, sowohl den Master-Part als auch den Teil des Sklaven. – zmo

+0

Danke. Das war genau das, was ich brauchte, um eine serielle Schnittstelle zu testen. –