Frage

Ich muss eine Anwendung mit seriellem Anschluss unter Linux testen, mein Testcomputer verfügt jedoch nur über einen seriellen Anschluss.

Gibt es eine Möglichkeit, Linux eine virtuelle serielle Schnittstelle hinzuzufügen und meine Anwendung zu testen, indem ich ein Gerät über eine Shell oder ein Skript emuliere?

Notiz:Ich kann den Port nicht neu zuordnen, er ist fest auf ttys2 codiert und ich muss die Anwendung testen, während sie geschrieben wird.

War es hilfreich?

Lösung

Sie können hierfür einen PTY („Pseudo-Teletyp“, wobei ein serieller Port ein „echter Teletyp“ ist) verwenden.An einem Ende offen /dev/ptyp5, und hängen Sie dann Ihr Programm an /dev/ttyp5; ttyp5 verhält sich wie ein serieller Port, sendet/empfängt jedoch alles, was er tut, über /dev/ptyp5.

Wenn Sie es wirklich brauchen, um mit einer Datei namens zu sprechen /dev/ttys2, dann ziehen Sie einfach Ihren alten um /dev/ttys2 Gehen Sie aus dem Weg und erstellen Sie einen Symlink von ptyp5 Zu ttys2.

Natürlich können Sie auch eine andere Zahl als verwenden ptyp5.Wählen Sie möglicherweise eine mit einer hohen Nummer aus, um Duplikate zu vermeiden, da alle Ihre Anmeldeterminals ebenfalls PTYS verwenden.

Wikipedia hat mehr über Ptys: http://en.wikipedia.org/wiki/Pseudo_terminal

Andere Tipps

Ergänzend zur Antwort von @slonik.

Sie können socat testen, um einen virtuellen seriellen Port zu erstellen, indem Sie das folgende Verfahren ausführen (getestet unter Ubuntu 12.04):

Öffnen Sie ein Terminal (nennen wir es Terminal 0) und führen Sie es aus:

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

Der obige Code gibt Folgendes zurück:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

Öffnen Sie ein anderes Terminal und schreiben Sie (Terminal 1):

cat < /dev/pts/2

Der Portname dieses Befehls kann je nach PC geändert werden.es hängt von der vorherigen Ausgabe ab.

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

Sie sollten die im hervorgehobenen Bereich verfügbare Nummer verwenden.

Öffnen Sie ein anderes Terminal und schreiben Sie (Terminal 2):

echo "Test" > /dev/pts/3

Kehren Sie nun zu Terminal 1 zurück und Sie sehen die Zeichenfolge „Test“.

Verwenden Sie dazu socat:

Zum Beispiel:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

Es gibt auch tty0tty http://sourceforge.net/projects/tty0tty/ Das ist ein echter Nullmodem-Emulator für Linux.

Es handelt sich um ein einfaches Kernelmodul – eine kleine Quelldatei.Ich weiß nicht, warum es bei SourceForge nur die Daumen gedrückt hat, aber bei mir funktioniert es gut.Das Beste daran ist, dass es auch die Hardware-Pins (RTC/CTS DSR/DTR) emuliert.Es implementiert sogar die iotcl-Befehle TIOCMGET/TIOCMSET und TIOCMIWAIT!

Bei einem neueren Kernel können Kompilierungsfehler auftreten.Dies lässt sich leicht beheben.Fügen Sie einfach ein paar Zeilen oben in der Quelle module/tty0tty.c ein (nach den Includes):

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

Wenn das Modul geladen ist, werden 4 Paare serieller Schnittstellen erstellt.Die Geräte sind /dev/tnt0 bis /dev/tnt7, wobei tnt0 mit tnt1, tnt2 mit tnt3 usw. verbunden ist.Möglicherweise müssen Sie die Dateiberechtigungen korrigieren, um die Geräte verwenden zu können.

bearbeiten:

Ich schätze, ich war mit meiner Begeisterung etwas voreilig.Der Treiber sieht zwar vielversprechend aus, wirkt aber instabil.Ich weiß es nicht genau, aber ich glaube, es hat eine Maschine im Büro, an der ich von zu Hause aus gearbeitet habe, zum Absturz gebracht.Ich kann erst am Montag nachsehen, wenn ich wieder im Büro bin.

Zweitens funktioniert TIOCMIWAIT nicht.Der Code scheint aus einem „winzigen TTY“-Beispielcode kopiert worden zu sein.Die Behandlung von TIOCMIWAIT scheint vorhanden zu sein, es wacht jedoch nie auf, da der entsprechende Aufruf von wake_up_interruptible() fehlt.

bearbeiten:

Der Unfall im Büro war tatsächlich die Schuld des Fahrers.Es fehlte eine Initialisierung und der völlig ungetestete TIOCMIWAIT-Code verursachte einen Absturz der Maschine.

Ich habe gestern und heute damit verbracht, den Treiber neu zu schreiben.Es gab viele Probleme, aber jetzt funktioniert es gut für mich.Es fehlt immer noch Code für die vom Treiber verwaltete Hardware-Flusskontrolle, aber ich benötige ihn nicht, da ich die Pins selbst mit TIOCMGET/TIOCMSET/TIOCMIWAIT aus dem Benutzermoduscode verwalten werde.

Wenn jemand an meiner Version des Codes interessiert ist, senden Sie mir eine Nachricht und ich sende sie Ihnen zu.

Vielleicht möchten Sie einen Blick darauf werfen Tibbo VSPDL zum Erstellen einer virtuellen seriellen Linux-Schnittstelle mithilfe eines Kernel-Treibers – es scheint ziemlich neu zu sein und steht jetzt zum Download zur Verfügung (Beta-Version).Ich bin mir derzeit nicht sicher, ob die Lizenz vorliegt oder ob sie sie in Zukunft nur kommerziell verfügbar machen soll.

Es gibt andere kommerzielle Alternativen, wie z http://www.ttyredirector.com/.

In Open Source, Remserie (GPL) kann unter Verwendung von Unix-PTYs auch tun, was Sie wollen.Es überträgt die seriellen Daten in „Rohform“ an einen Netzwerk-Socket;Die STTY-ähnliche Einrichtung von Terminalparametern muss beim Erstellen des Ports erfolgen. Eine spätere Änderung wie in RFC 2217 beschrieben scheint nicht unterstützt zu werden.Sie sollten in der Lage sein, zwei Remserial-Instanzen auszuführen, um ein virtuelles Nullmodem wie com0com zu erstellen, außer dass Sie die Portgeschwindigkeit usw. im Voraus einrichten müssen.

Sokat (auch GPL) ist wie eine erweiterte Variante von Remserial mit vielen, vielen weiteren Optionen, einschließlich einer „PTY“-Methode zum Umleiten des PTY an etwas anderes, das eine andere Instanz von Socat sein kann.Für Unit-Tests ist socat wahrscheinlich besser als remserial, da Sie cat-Dateien direkt in den PTY kopieren können.Siehe die PTY-Beispiel auf der Manpage.A Patch existiert unter „contrib“, um RFC2217-Unterstützung für die Aushandlung von Einstellungen für serielle Leitungen bereitzustellen.

Unter Verwendung der in den vorherigen Antworten geposteten Links habe ich ein kleines Beispiel in C++ mit einem virtuellen seriellen Port codiert.Ich habe den Code in GitHub gepusht: https://github.com/cymait/virtual-serial-port-example .

Der Code ist ziemlich selbsterklärend.Zuerst erstellen Sie den Master-Prozess, indem Sie ./main master ausführen, und er wird auf dem vom Gerät verwendeten Standardserver gedruckt.Danach rufen Sie ./main-Slave-Gerät auf, wobei Gerät das im ersten Befehl angegebene Gerät ist.

Und das ist es.Sie haben eine bidirektionale Verbindung zwischen den beiden Prozessen.

Anhand dieses Beispiels können Sie die Anwendung testen, indem Sie alle Arten von Daten senden, und sehen, ob sie ordnungsgemäß funktioniert.

Außerdem können Sie das Gerät jederzeit mit einem Symlink verknüpfen, sodass Sie die zu testende Anwendung nicht neu kompilieren müssen.

Könnten Sie einen USB->RS232-Adapter verwenden?Ich habe ein paar und sie verwenden nur den FTDI-Treiber.Dann sollten Sie in der Lage sein, /dev/ttyUSB0 (oder was auch immer erstellt wird) in /dev/ttyS2 umzubenennen.

Mir fallen drei Möglichkeiten ein:

Implementieren Sie RFC 2217

RFC 2217 umfasst einen COM-Port zum TCP/IP-Standard, der es einem Client auf einem System ermöglicht, einen seriellen Port für die lokalen Programme zu emulieren und gleichzeitig Daten und Steuersignale transparent an einen Server auf einem anderen System zu senden und zu empfangen, der tatsächlich über den seriellen Port verfügt.Hier ist ein Überblick auf hoher Ebene.

Was Sie tun würden, wäre, einen Client-Com-Port-Treiber zu finden oder zu implementieren, der die Client-Seite des Systems auf Ihrem PC implementiert – der scheinbar ein echter serieller Port ist, in Wirklichkeit aber alles an einen Server überträgt.Möglicherweise können Sie diesen Treiber kostenlos von Digi, Lantronix usw. zur Unterstützung ihrer echten eigenständigen Server mit serieller Schnittstelle erhalten.

Anschließend implementieren Sie die Serverseite der Verbindung lokal in einem anderen Programm, sodass der Client eine Verbindung herstellen und die Daten und Steuerbefehle nach Bedarf ausgeben kann.

Es ist wahrscheinlich nicht trivial, aber der RFC ist da draußen, und Sie können möglicherweise ein Open-Source-Projekt finden, das eine oder beide Seiten der Verbindung implementiert.

Ändern Sie den Treiber für die serielle Linux-Schnittstelle

Alternativ ist die Treiberquelle für die serielle Schnittstelle für Linux jederzeit verfügbar.Nehmen Sie das, entfernen Sie die Hardware-Steuerelemente und lassen Sie diesen einen Treiber als einfachen Loopback zwei /dev/ttySx-Ports ausführen.Verbinden Sie dann Ihr echtes Programm mit dem ttyS2 und Ihren Simulator mit dem anderen ttySx.

Verwenden Sie zwei USB<-->Seriell-Kabel in einem Loopback

Aber was ist jetzt am einfachsten?Geben Sie 40 US-Dollar für zwei USB-Geräte mit seriellem Anschluss aus, verkabeln Sie sie miteinander (Nullmodem) und haben Sie tatsächlich zwei echte serielle Anschlüsse – einen für das Programm, das Sie testen, und einen für Ihren Simulator.

-Adam

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top