Forum: PC Hard- und Software Linux tty Serielle Schnitstelle Bash lesen


von Lukas (Gast)


Lesenswert?

Hallo,

ich möchte Daten an /dev/ttyUSB0 lesen.

Egal wie ich von der Schnittstelle lese schaut es so aus als würde ich 
erst Daten bekommen wenn ein Buffer voll ist, auch wenn noch Restdaten 
kommen müssten. Diese kommen erst beim nächsten packet mit. Somit 
verschiebt sich der Anfang der Daten dauernd.
Wie ich die Daten anschaue ist egal ob mit hexdump oder mit od oder auch 
xxd.
Unter Windows mit hterm kommt immer im einen schwupp alle Daten von 
Anfang bis Ende.
Woran kann das liegen?

Lukas

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Vermutlich an den Einstellungen der Schnittstelle. stty sei dir an der 
Stelle nahegelegt. Kannst mal die Ausgabe von stty -F /dev/ttyUSB0 hier 
posten.

Matthias

von Lukas (Gast)


Lesenswert?

Da habe ich auch schon versucht etwas zu ändern, leider hat sich aber an 
dem eigentlichen Problem nichts geändert.

das ist die Standard Einstellung:
speed 9600 baud; line = 0;
min = 0; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke


bei einem stty -F /dev/ttyUSB0 -a
bekomme ich:

speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 5;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon 
-ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop 
-echoprt -echoctl -echoke -flusho -extproc

von foobar (Gast)


Lesenswert?

Zeig mal wie du liest aus /dev/ttyusb0.

Wie schauen die zu lesenden Daten aus?

von Lukas (Gast)


Lesenswert?

Ich verwende das Beispiel von hier:

https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/emh-ehz-h1

es ist aber egal ob ich es so z.B. versuche

cat /dev/ttyUSB0 | od -tx1

dann kommen immer Daten mit einer ganzen vollen Zeile was aber nicht so 
ist, es müsste dann z.B. eine halbe Zeile dabei sein. Hier habe ich bei 
jeder pause ein Enter gedrückt. es verschiebt sich dann der Anfang des 
Protokolls 1B 1B 1B 1B 01 01 01 01 76
Es müsste aber jeder Block damit beginnen.

pi@raspberrypi:~/ehz $ cat /dev/ttyUSB0 | od -tx1
0000000 1b 1b 1b 1b 01 01 01 01 76 07 00 0e 00 06 0a 26
0000020 62 00 62 00 72 63 01 01 76 01 01 07 00 0e 00 01
0000040 03 62 0b 09 01 45 4d 48 00 00 6b d5 08 01 01 63
0000060 72 3b 00 76 07 00 0e 00 06 0a 27 62 00 62 00 72
0000100 63 07 01 77 01 0b 09 01 45 4d 48 00 00 6b d5 08
0000120 07 01 00 62 0a ff ff 72 62 01 65 00 01 a0 77 7a
0000140 77 07 81 81 c7 82 03 ff 01 01 01 01 04 45 4d 48
0000160 01 77 07 01 00 00 00 09 ff 01 01 01 01 0b 09 01
0000200 45 4d 48 00 00 6b d5 08 01 77 07 01 00 01 08 00
0000220 ff 64 01 01 00 01 62 1e 52 ff 56 00 00 00 32 50
0000240 01 77 07 01 00 02 08 00 ff 64 01 01 00 01 62 1e
0000260 52 ff 56 00 00 00 07 9a 01 77 07 01 00 01 08 01
0000300 ff 01 01 62 1e 52 ff 56 00 00 00 32 50 01 77 07
0000320 01 00 02 08 01 ff 01 01 62 1e 52 ff 56 00 00 00
0000340 07 9a 01 77 07 01 00 01 08 02 ff 01 01 62 1e 52
0000360 ff 56 00 00 00 00 00 01 77 07 01 00 02 08 02 ff
0000400 01 01 62 1e 52 ff 56 00 00 00 00 00 01 77 07 01
0000420 00 10 07 00 ff 01 01 62 1b 52 ff 55 00 00 00 00
0000440 01 77 07 81 81 c7 82 05 ff 01 01 01 01 83 02 25
0000460 b1 1b 4e 47 63 9c e0 1f e1 7b 3c eb 32 8a 81 2f
0000500 2a f2 b6 a6 22 0b a9 f8 97 d3 56 97 c2 27 5e 58
0000520 78 4f b8 bd 7d 11 a8 4a c9 d6 55 b9 fe 16 07 01
0000540 01 01 63 7a 54 00 76 07 00 0e 00 06 0a 2a 62 00
0000560 62 00 72 63 02 01 71 01 63 52 17 00 1b 1b 1b 1b

0000600 1a 00 64 3f 1b 1b 1b 1b 01 01 01 01 76 07 00 0e
0000620 00 06 0a 2c 62 00 62 00 72 63 01 01 76 01 01 07
0000640 00 0e 00 01 03 64 0b 09 01 45 4d 48 00 00 6b d5
0000660 08 01 01 63 f8 78 00 76 07 00 0e 00 06 0a 2d 62
0000700 00 62 00 72 63 07 01 77 01 0b 09 01 45 4d 48 00
0000720 00 6b d5 08 07 01 00 62 0a ff ff 72 62 01 65 00
0000740 01 a0 79 7a 77 07 81 81 c7 82 03 ff 01 01 01 01
0000760 04 45 4d 48 01 77 07 01 00 00 00 09 ff 01 01 01
0001000 01 0b 09 01 45 4d 48 00 00 6b d5 08 01 77 07 01
0001020 00 01 08 00 ff 64 01 01 00 01 62 1e 52 ff 56 00
0001040 00 00 32 50 01 77 07 01 00 02 08 00 ff 64 01 01
0001060 00 01 62 1e 52 ff 56 00 00 00 07 9a 01 77 07 01
0001100 00 01 08 01 ff 01 01 62 1e 52 ff 56 00 00 00 32
0001120 50 01 77 07 01 00 02 08 01 ff 01 01 62 1e 52 ff
0001140 56 00 00 00 07 9a 01 77 07 01 00 01 08 02 ff 01
0001160 01 62 1e 52 ff 56 00 00 00 00 00 01 77 07 01 00
0001200 02 08 02 ff 01 01 62 1e 52 ff 56 00 00 00 00 00
0001220 01 77 07 01 00 10 07 00 ff 01 01 62 1b 52 ff 55
0001240 00 00 00 00 01 77 07 81 81 c7 82 05 ff 01 01 01
0001260 01 83 02 25 b1 1b 4e 47 63 9c e0 1f e1 7b 3c eb
0001300 32 8a 81 2f 2a f2 b6 a6 22 0b a9 f8 97 d3 56 97
0001320 c2 27 5e 58 78 4f b8 bd 7d 11 a8 4a c9 d6 55 b9
0001340 fe 16 07 01 01 01 63 3f 68 00 76 07 00 0e 00 06
0001360 0a 30 62 00 62 00 72 63 02 01 71 01 63 9f 71 00

0001400 1b 1b 1b 1b 1a 00 1d b6 1b 1b 1b 1b 01 01 01 01
0001420 76 07 00 0e 00 06 0a 32 62 00 62 00 72 63 01 01
0001440 76 01 01 07 00 0e 00 01 03 66 0b 09 01 45 4d 48
0001460 00 00 6b d5 08 01 01 63 05 53 00 76 07 00 0e 00
0001500 06 0a 33 62 00 62 00 72 63 07 01 77 01 0b 09 01
0001520 45 4d 48 00 00 6b d5 08 07 01 00 62 0a ff ff 72
0001540 62 01 65 00 01 a0 7a 7a 77 07 81 81 c7 82 03 ff
0001560 01 01 01 01 04 45 4d 48 01 77 07 01 00 00 00 09
0001600 ff 01 01 01 01 0b 09 01 45 4d 48 00 00 6b d5 08
0001620 01 77 07 01 00 01 08 00 ff 64 01 01 00 01 62 1e
0001640 52 ff 56 00 00 00 32 50 01 77 07 01 00 02 08 00
0001660 ff 64 01 01 00 01 62 1e 52 ff 56 00 00 00 07 9a
0001700 01 77 07 01 00 01 08 01 ff 01 01 62 1e 52 ff 56
0001720 00 00 00 32 50 01 77 07 01 00 02 08 01 ff 01 01
0001740 62 1e 52 ff 56 00 00 00 07 9a 01 77 07 01 00 01
0001760 08 02 ff 01 01 62 1e 52 ff 56 00 00 00 00 00 01
0002000 77 07 01 00 02 08 02 ff 01 01 62 1e 52 ff 56 00
0002020 00 00 00 00 01 77 07 01 00 10 07 00 ff 01 01 62
0002040 1b 52 ff 55 00 00 00 00 01 77 07 81 81 c7 82 05
0002060 ff 01 01 01 01 83 02 25 b1 1b 4e 47 63 9c e0 1f
0002100 e1 7b 3c eb 32 8a 81 2f 2a f2 b6 a6 22 0b a9 f8
0002120 97 d3 56 97 c2 27 5e 58 78 4f b8 bd 7d 11 a8 4a
0002140 c9 d6 55 b9 fe 16 07 01 01 01 63 51 99 00 76 07
0002160 00 0e 00 06 0a 36 62 00 62 00 72 63 02 01 71 01

0002200 63 e8 84 00 1b 1b 1b 1b 1a 00 70 30 1b 1b 1b 1b
0002220 01 01 01 01 76 07 00 0e 00 06 0a 38 62 00 62 00
0002240 72 63 01 01 76 01 01 07 00 0e 00 01 03 68 0b 09
0002260 01 45 4d 48 00 00 6b d5 08 01 01 63 ec ff 00 76
0002300 07 00 0e 00 06 0a 39 62 00 62 00 72 63 07 01 77
0002320 01 0b 09 01 45 4d 48 00 00 6b d5 08 07 01 00 62
0002340 0a ff ff 72 62 01 65 00 01 a0 7c 7a 77 07 81 81
0002360 c7 82 03 ff 01 01 01 01 04 45 4d 48 01 77 07 01
0002400 00 00 00 09 ff 01 01 01 01 0b 09 01 45 4d 48 00
0002420 00 6b d5 08 01 77 07 01 00 01 08 00 ff 64 01 01
0002440 00 01 62 1e 52 ff 56 00 00 00 32 50 01 77 07 01
0002460 00 02 08 00 ff 64 01 01 00 01 62 1e 52 ff 56 00
0002500 00 00 07 9a 01 77 07 01 00 01 08 01 ff 01 01 62
0002520 1e 52 ff 56 00 00 00 32 50 01 77 07 01 00 02 08
0002540 01 ff 01 01 62 1e 52 ff 56 00 00 00 07 9a 01 77
0002560 07 01 00 01 08 02 ff 01 01 62 1e 52 ff 56 00 00
0002600 00 00 00 01 77 07 01 00 02 08 02 ff 01 01 62 1e
0002620 52 ff 56 00 00 00 00 00 01 77 07 01 00 10 07 00
0002640 ff 01 01 62 1b 52 ff 55 00 00 00 00 01 77 07 81
0002660 81 c7 82 05 ff 01 01 01 01 83 02 25 b1 1b 4e 47
0002700 63 9c e0 1f e1 7b 3c eb 32 8a 81 2f 2a f2 b6 a6
0002720 22 0b a9 f8 97 d3 56 97 c2 27 5e 58 78 4f b8 bd
0002740 7d 11 a8 4a c9 d6 55 b9 fe 16 07 01 01 01 63 9f
0002760 c8 00 76 07 00 0e 00 06 0a 3c 62 00 62 00 72 63
0003000 02 01 71 01 63 60 93 00 1b 1b 1b 1b 1a 00 3c 01

unter Windows kommt der Datensatz komplett dann eine Pause dann der 
nächste komplett wieder richtig beginnend.

von Εrnst B. (ernst)


Lesenswert?

das Problem liegt an "od", nicht an der Schnittstelle:

Probier mal
1
> (echo -n "A              "; sleep 5; echo -n "BC"; sleep 5) | od -tx1

--> selbes Ergebnis.

d.H. dein Problem verschwindet, sobald du statt hexdump was sinnvolles 
mit deinen ttyUSB0-Daten machst.

von Norbert (Gast)


Lesenswert?

Nein, das Problem liegt auch nicht an 'od'!
1
man stdbuf
2
stdbuf  -  BEFEHL  mit  veränderten Pufferaktionen der Standardein- und
3
       ausgabe ausführen

von Lukas (Gast)


Lesenswert?

leider nicht, in dem Script ist kein od.

Das hat damals scheinbar auch schon der Ersteller von dem Script gemerkt 
und die Schleife eingebaut.
Wenn ich nun das Script verwende und nun bei "missed start..." mir den 
falschen Start anschaue schaut das so aus:

pi@raspberrypi:~/ehz $ ./read.sh
missed start and trying again...
FF6401010001621E52
missed start and trying again...
01621B52FF55000000
missed start and trying again...
EDAD1B1B1B1B010101
missed start and trying again...
0104454D4801770701
missed start and trying again...
621E52FF5600000007
missed start and trying again...
220BA9F897D35697C2
missed start and trying again...
08010163DB05007607
missed start and trying again...
56000000326C017707
missed start and trying again...
000000000001770701
missed start and trying again...
630201710163832E00
missed start and trying again...
A9147A77078181C782
missed start and trying again...
000000326C01770701
missed start and trying again...
639CE01FE17B3CEB32
missed start and trying again...
0E00010F7C0B090145
missed start and trying again...
070100010800FF6401
missed start and trying again...
0177070100020802FF
missed start and trying again...
47007607000E00062E
missed start and trying again...
D508070100620AFFFF
missed start and trying again...
010801FF0101621E52
missed start and trying again...
01010101830225B11B
missed start and trying again...
006200726301017601
missed start and trying again...
0B0901454D4800006B
missed start and trying again...
FF0101621E52FF5600
missed start and trying again...
C9D655B9FE16070101
missed start and trying again...
63070177010B090145
missed start and trying again...
0001621E52FF560000
missed start and trying again...
52FF55000000000177
Meter 1.8.0 (from plant):     1.29 kWh
Meter 2.8.0 (to plant):       0 kWh
Total effective power (+/-):  0 W
pi@raspberrypi:~/ehz $






code:
1
#!/bin/bash
2
# read and evaluate SML output received from EMH eHZ
3
4
# set serial device
5
INPUT_DEV="/dev/ttyUSB0"
6
7
#set $INPUT_DEV to 9600 8N1
8
stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
9
10
SML_START_SEQUENCE="1B1B1B1B0101010176"
11
METER_OUTPUT__START_SEQUENCE=""
12
13
while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ]
14
do
15
        METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 480`
16
        METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}")
17
        if [ $METER_OUTPUT__START_SEQUENCE != $SML_START_SEQUENCE ];
18
        then
19
                echo "missed start and trying again..."
20
                echo $METER_OUTPUT__START_SEQUENCE
21
                #exit 1
22
                METER_OUTPUT=""
23
        fi
24
done
25
26
let METER_180=0x${METER_OUTPUT:315:10}
27
VALUE=$(echo "scale=2; $METER_180 / 10000" |bc)
28
echo "Meter 1.8.0 (from plant):    " $VALUE "kWh"
29
30
let METER_180=0x${METER_OUTPUT:363:9}
31
VALUE=$(echo "scale=2; $METER_180 / 10000" |bc)
32
echo "Meter 2.8.0 (to plant):      " $VALUE "kWh"
33
34
let METER_180=0x${METER_OUTPUT:577:8}
35
VALUE=$(echo "scale=2; $METER_180 / 10" |bc)
36
echo "Total effective power (+/-): " $VALUE "W"

von meetoo (Gast)


Lesenswert?

Hab letzthin mit einem DCF77 Zeitmpfänger & seriellen Schnittstelle 
rumgespielt und landete am selben Problem. U.a. wollte ich unbedingt die 
Zeit erfassen, vom Öffnen/aktivieren d.ser. Porta (womit der DCF Rx erst 
Stromversorgung bekommt) bis a) überhaubt Telegramme kommen (mit noch 
ungültiger Zeitinfo) und bis b) dann auch Telegramme mit güttiger 
Zeitinfo kommen.

Ich hoffte dies mit etwas Kurzgebas(h)tel hinzubekommen, gab dann aber 
auf. (ging nur mit Zeitüberbrückung per sleep, was aber die ZeitMESSUNG 
vereitelte).

Habe dann per Python gemacht. Ansatz: Empfangspuffer "shiften" bis zum 
"Kopfmuster" des Telegramms, dann für folgende Lesungen Puffergrösse 
anpassen.
Ich GLAUBE damit kein Telegramm am Anfang zu verpassen... ;-)

Ich WILL nicht hinnehmen dass es per bash nicht gehen soll, da muss noch 
ein Kniff sein den ich auch kennen lernen will!

von Jim M. (turboj)


Lesenswert?

Wird schwierig.

Der Code funktioniert nur wenn das 1. Byte auch das Start Byte der 
Sequenz ist, was angesichts der relativ dicken FIFOs in USB2UART 
Wandlern durchaus nicht unbedingt der Fall sein muss.

Dein Bash Code macht ständig den TTY auf und wieder zu, damit könnte man 
Bytes verlieren.

Hier würde ich eher den TTY als Standard Input benutzen:
1
./skript.sh </dev/ttyUSB0

Die daten kann man dann via "read" lesen. Zuerst würde ich immer nur ein 
Zeichen lesen biss das 1. Zeichen der Startsequenz erkannt wird.

Allerdings erscheint mir die Lösung mit Python o.ä. sinnvoller, weil 
besser wartbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.