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
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
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
Zeig mal wie du liest aus /dev/ttyusb0. Wie schauen die zu lesenden Daten aus?
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.
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.
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 |
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" |
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.