Serial Port Loopback / Duplex Test, in Bash oder C? (Prozessersetzung)

Ich habe ein serielles Gerät als Loopback eingerichtet (das heißt, es gibt einfach jedes Zeichen zurück, das es empfängt), und ich möchte die effektive Durchsatzgeschwindigkeit messen. Dafür habe ich gehofft, ich könnte @ verwendtime, wie i

time bash -c '...'

wo '... 'wäre ein Befehl, den ich ausführen könnte.

Nun, das erste Problem ist, dass ich das Gerät mit 2000000 bps verwenden möchte, daher kann ich @ nicht verwende ttylog oderBildschir (beide scheinen nur auf 115200 bps zu steigen). Arbeiten mit/dev/ttyUSB0 als Datei (mit Dateiumleitung undcat) scheint gut zu funktionieren:

# initialize serial port
stty 2000000 -ixon icanon </dev/ttyUSB0

# check settings
stty -a -F /dev/ttyUSB0

# in one terminal - read from serial port
while (true) do cat -A /dev/ttyUSB0 ; done

# in other terminal - write to serial port
echo "1234567890" > /dev/ttyUSB0

# back to first terminal, I now have:
# $ while (true) do cat -A /dev/ttyUSB0 ; done
# 1234567890$
# ...

Jetzt möchte ich etwas Ähnliches machen - ich möchtecat eine Datei an eine serielle Schnittstelle, und lassen Sie die serielle Schnittstelle zurücklesen - aber von einem einzelnen Terminal-Befehl (so könnte ich es als Argument für @ verwendtime).

Ich dachte, ich könnte eine Bash-Prozessersetzung verwenden, um den Teil "Schreiben" und "Lesen" sozusagen "parallel" laufen zu lassen - wenn ich es mit Named Pipes versuche, funktioniert es:

# mkfifo my.pipe # same as below:
$ mknod my.pipe p

$ comm <(echo -e "test\ntest\ntest\n" > my.pipe) <(cat my.pipe)
    test
    test
    test
comm: file 2 is not in sorted order

Up da, ich benutze nichtcomm für einen anderen Zweck, als die beiden Prozesse zu einem einzigen Befehl zusammenzuführen (ich denke, ich hätte auch @ verwenden könneecho stattdessen)

Leider scheint dieser Trick mit einer seriellen Schnittstelle nicht zu funktionieren, denn wenn ich es versuche, erhalte ich manchmal:

$ comm <(echo "1234567890" > /dev/ttyUSB0) <(while (true) do cat -A /dev/ttyUSB0 ; done)
cat: /dev/ttyUSB0: Invalid argument

... normalerweise bekomme ich aber einfach gar keine ausgabe. Dies sagt mir: Entweder gibt es keine Kontrolle darüber, welcher Prozess zuerst startet, und socatöglicherweise beginnt @ mit dem Lesen, bevor der Port bereit ist (im obigen ersten Beispiel scheint dies jedoch kein Problem zu sein). oder in Linux / Bash können Sie nicht gleichzeitig an einer seriellen Schnittstelle lesen und schreibeInvalid argument "würde in jenen Momenten auftreten, in denen sowohl Lesen als auch Schreiben zur gleichen Zeit zu erfolgen scheinen.

Also meine Fragen sind:

Gibt es eine Möglichkeit, so etwas zu tun cat eine Datei an einen seriellen Port, der als Loopback konfiguriert ist; Lesen Sie es zurück und sehen Sie, wie lange es nur in Bash dauert, ohne ein spezielles C-Programm schreiben zu müsseWenn ich ein spezielles C-Programm benötige, gibt es Quellenbeispiele im Internet, die ich verwenden könnte?

Vielen Dank für alle Antworten,

Prost

 

EDIT: Mir ist bewusst, dass daswhileie oben beschriebene @ -Schleife wird nicht beendet. Diese Befehlszeile diente zu Testzwecken, und ich unterbreche sie mit Strg-C. Ich könnte es im Prinzip mit so etwas wie @ unterbrechtimeout -9 0.1 bash -c 'while (true) do echo AA ; done', aber das würde den Zweck von @ zunichte machtime, dann : )

Der Grund dasswhile ist da, ist das vorerst, lesen übercat vom Gerät wird sofort beendet; manchmal, ichhabe das Gerät einrichten, so dass, wenncat wird ausgegeben, es blockiert und wartet auf eingehende Daten; aber ich kann noch nicht abschätzen, was los ist (und teilweise suche ich deshalb nach einer Möglichkeit, von der Kommandozeile aus zu testen).

Falls ich das @ nicht benutzt hawhile, Ich stelle mir für das Timing vor, ich würde so etwas verwenden:

time bash -c 'comm <(echo "1234567890" > /dev/ttyUSB0) <(cat -A /dev/ttyUSB0)'

... aber damit dies funktioniert, wird davon ausgegangen, dasscat -A /dev/ttyUSB0 startet zuerst und blockiert; dann ist dieecho schreibt an die serielle Schnittstelle (und beendet); und danncat -A gibt alles aus, was es von der seriellen Schnittstelle gelesen hat - und wird dann beendet. Und ich bin mir nicht wirklich sicher, ob sich eine serielle Schnittstelle überhaupt so verhalten kann oder obcat kann so gemacht werden, dass es beliebig blockiert und beendet wird).

Die genaue Methode spielt wirklich keine Rolle; wenn möglich, möchte ich es einfach vermeiden, mein eigenes C-Programm für diese Art von Tests zu programmieren. Deshalb ist es mein Hauptinteresse, ob es irgendwie möglich ist, einen solchen "Vollduplex-Test" mit Basic Bash / Linux (dhcoreutils); und wenn nicht, wenn es einen vorgefertigten Code gibt, den ich für so etwas verwenden kann).

EDIT2: Möglicherweise auch relevant:

Parallele Prozesse in Bash - Ubuntu Forums

Antworten auf die Frage(4)

Ihre Antwort auf die Frage