Benutze ts!

Benutze ts!

Ich verwende Cutecom für den seriellen Anschluss, da es einen Zeitstempel hat, da ich auf zwei verschiedene Daten verweisen muss. Aber ich kann diese Daten nicht mit Zeitstempel protokollieren und brauche eine Genauigkeit in Millisekunden. Gibt es einen Vorschlag?

Danke, Selim.

Antwort1

Wenn Sie keinen Terminalemulator benötigen, können Sie socatdie -vOption verwenden, die alle Ein-/Ausgaben mit einem Zeitstempel protokolliert. Beispiel:

socat -v READLINE /dev/ttyS0,b19200,raw,echo=0 2>/tmp/log

Was auch immer Sie auf dem Standardeingang dieses Befehls eingeben, wird ttyS0mit der angegebenen Baudrate usw. an den seriellen Port gesendet. Und jede Eingabe vom seriellen Port erscheint auf Standardausgang. Darin /tmp/logfinden Sie Zeilen wie

> 2019/11/06 13:56:27.996129  length=6 from=0 to=5
hello
< 2019/11/06 13:56:37.024451  length=8 from=0 to=7
my reply

Das entspricht dem Eintippen von „hallo\n“ und der Rückmeldung „meine Antwort“.

Antwort2

Benutze ts!

Unter jedem Unix und im Windows-Subsystem für Linux (auch bekannt als WSL) können Sie das moreutilsPaket installieren, das das tsTool enthält. tsFügt Textdaten, die in die Standardeingabe eingespeist werden, Zeitstempel hinzu.

Installationauf zB Ubuntu:

$ sudo apt-get install moreutils

Verwendung

Vorausgesetzt, Ihr serieller Port ist beispielsweise ttyS70, können Sie diese Befehlszeile ausführen, um

  • Serielle Daten von diesem Port lesen (mit cat),
  • Fügen Sie einen Zeitstempel hinzu (mit ts) und
  • Drucken Sie die resultierende Zeile aus und speichern Sie sie gleichzeitig in einer Datei (mit tee):
$ cat /dev/ttyS70 | ts | tee logfile

Für meine Art von seriellen Daten sieht das Ergebnis folgendermaßen aus:

Feb 14 18:37:03 13438 1     0     0.0     19  -80.00    0.00 1
Feb 14 18:37:03 13440 1     0     0.0     19  -80.00    0.00 1
Feb 14 18:37:04 13441 1     0     0.0     19  -80.00    0.00 1
Feb 14 18:37:04 13442 1     0     0.0     19  -80.00    0.00 1
Feb 14 18:37:04 13444 1     0     0.0     19  -80.00    0.00 1

In diesem Beispiel empfängt der serielle Port mehr als eine Zeile pro Sekunde. Da die Zeitstempelauflösung Sekunden beträgt, tragen mehrere Zeilen denselben Zeitstempel. Um einen Zeitstempel mit höherer Auflösung hinzuzufügen, tskönnen Sie steuern, wie der Zeitstempel formatiert wird. Beispielsweise %.serhalten Sie Sekunden seit 1970 in einer Auflösung von unter einer Sekunde:

$ cat /dev/ttyS70 | ts %.s | tee logfile

führt zu

1676396776.277146 18963 1     0     0.0     19  -80.00    0.00 1
1676396776.405363 18964 1     0     0.0     19  -80.00    0.00 1
1676396776.532999 18966 1     0     0.0     19  -80.00    0.00 1
1676396776.660920 18967 1     0     0.0     19  -80.00    0.00 1
1676396776.789261 18968 1     0     0.0     19  -80.00    0.00 1
1676396776.917136 18969 1     0     0.0     19  -80.00    0.00 1

Wenn Sie keine absoluten Zeitangaben benötigen, können Sie den Schalter verwenden -s. Damit erhalten Sie die seit dem Programmstart vergangene Zeit:

$ cat /dev/ttyS70 | ts -s %.s | tee logfile

führt zu

0.072230 6459 42     0     0.0  20567 -100.00    0.00 1
0.199964 6459 42     0     0.0  20567 -100.00    0.00 1
0.311792 6460 42     0     0.0  20568 -100.00    0.00 1
0.439221 6460 42     0     0.0  20566 -100.00    0.00 1
0.567191 6460 42     0     0.0  20566 -100.00    0.00 1
0.694773 6460 42     0     0.0  20566 -100.00    0.00 1
0.822279 6461 42     0     0.0  20567 -100.00    0.00 1
0.950085 6461 42     0     0.0  20566 -100.00    0.00 1
1.061797 6461 42     0     0.0  20567 -100.00    0.00 1
1.189510 6461 42     0     0.0  20568 -100.00    0.00 1

verwandte Informationen