Hi, ich empfange von einem Bluetooth serial device daten: Ich kann entweder mit Windows und hterm, bei folgenden Einstellungen: Baud: 9600 , Databits 7, parity even, stop bits 1. Diesen Output zyklisch empfangen: /ESY5Q3DA1004 V3.02 1-0:0.0.0*255(0273011003463) 1-0:1.8.0*255(00001320.5410118*kWh) 1-0:21.7.255*255(000009.04*W) 1-0:41.7.255*255(000209.88*W) 1-0:61.7.255*255(000111.52*W) 1-0:1.7.255*255(000330.44*W) 1-0:96.5.5*255(82) 0-0:96.1.255*255(1ESY1011003463) ! Wenn ich aber die gleichen Einstellung mit Coolterm unter MAC oder mit Screen oder PErl unter Linux verwende, dann sieht der Output immer so aus: ??SY5?3DA?00??V3.0?? ? ?-0:0.0.0??55(0??30??003?63?? ?-0:?.?.0??55(0000?3?0.3??90?????詍 ?-0:??.?.?55??55(00000?.?9?ש? ?-0:??.?.?55??55(000???.03?ש? ?-0:6?.?.?55??55(000??3.55?ש? ?-0:?.?.?55??55(000333.???ש? ?-0:96.5.5??55(???? 0-0:96.?.?55??55(??SY?0??003?63?? !? Woran liegt das? und wie kann ich das richtig einstellen? Vielen Dank Gruß kami
Hi, hat denn keiner einen Vorschlag woran das liegen kann? Gruß kami
Das kann ein Konvertierungsproblem sein, (ASCII->UTF8) oder auch mit den unterschiedlichen Newline codierungen zu tun haben. Lass dir die Daten als Hex-Code darstellen und vergleiche sie.
Naja wenn die Baudrate nicht stimmt schaut's etwa so aud wie im Zweiten. Zwei Prozent falsch genuegen... Allerdings ist 7bit, even parity, 1 stop hinreichend exotisch. Standard ist 8bit no parity, 1 stop.
Hi, also das komisch ist, das ich inzwischen mit zterm unter Mac und mit Hterm unter Windows das richtige ergebnis bekommen. Kann es ein Kodierungsproblem unter Linux sein? Das mir diesen Output liefert? Ich verstehe es nicht mehr. Wie kann ich das unter Linux testen, ob es an der Codierung liegt? Vielen Dank. Gruß kami
@ Stefan S. Installiere unter linux das Programm "moserial", da sind dann zwei Fenster in denen du die empfangenen Bytes als ASCII und hex sehen kannst. sudo apt-get install moserial Speichere dann einen Abschnitt und Poste den als Datei hier. Man kann sich das dann mit einem Hex-editor anschauen oder unter Linux mit einem Texteditor der die Daten UTF Codiert.
Hi, problem mit moserial ist, ich habe nur eine console das ist ein server und ich kann da nicht gtk installieren. Gibt es noch ein anderes Tool. Vielen dank. Gruß kami
cat /dev/ttyUSB0 > temp.data hexdump -C temp.data oder online mit cat /dev/ttyUSB0 | hexdump -C
Ach ja, auch wenn es ein Server ist: mit rdesktop, vnc oder ssh -Y user@server.com bekommst du ein Bild. Bei letzterem evtl. in der Config einstellen.
Hi okay hier ist der Output: 00000000 af c5 53 59 35 d1 33 44 41 b1 30 30 b4 a0 56 33 |..SY5.3DA.00..V3| 00000010 2e 30 b2 8d 0a 8d 0a b1 2d 30 3a 30 2e 30 2e 30 |.0......-0:0.0.0| 00000020 aa b2 35 35 28 30 b2 b7 33 30 b1 b1 30 30 33 b4 |..55(0..30..003.| 00000030 36 33 a9 8d 0a b1 2d 30 3a b1 2e b8 2e 30 aa b2 |63....-0:....0..| 00000040 35 35 28 30 30 30 30 b1 33 b4 30 2e b1 39 35 35 |55(0000.3.0..955| 00000050 b1 35 33 aa eb d7 e8 a9 8d 0a b1 2d 30 3a b2 b1 |.53........-0:..| 00000060 2e b7 2e b2 35 35 aa b2 35 35 28 30 30 30 30 36 |....55..55(00006| 00000070 b4 2e 33 36 aa d7 a9 8d 0a b1 2d 30 3a b4 b1 2e |..36......-0:...| 00000080 b7 2e b2 35 35 aa b2 35 35 28 30 30 30 33 b8 b1 |...55..55(0003..| 00000090 2e b4 35 aa d7 a9 8d 0a b1 2d 30 3a 36 b1 2e b7 |..5......-0:6...| 000000a0 2e b2 35 35 aa b2 35 35 28 30 30 30 b1 b1 b7 2e |..55..55(000....| 000000b0 39 33 aa d7 a9 8d 0a b1 2d 30 3a b1 2e b7 2e b2 |93......-0:.....| 000000c0 35 35 aa b2 35 35 28 30 30 30 35 36 33 2e b7 b4 |55..55(000563...| 000000d0 aa d7 a9 8d 0a b1 2d 30 3a 39 36 2e 35 2e 35 aa |......-0:96.5.5.| 000000e0 b2 35 35 28 b8 b2 a9 8d 0a 30 2d 30 3a 39 36 2e |.55(.....0-0:96.| 000000f0 b1 2e b2 35 35 aa b2 35 35 28 b1 c5 53 59 b1 30 |...55..55(..SY.0| 00000100 b1 b1 30 30 33 b4 36 33 a9 8d 0a 21 8d 0a |..003.63...!..| 0000010e
Im Hexdump sind Bytes mit gesetztem Bit 7 zu sehen - das passt nicht zu den angeblichen 7 Datenbits. Und das wird auch das Darstellungsproblem sein, wenn man nämlich 7 Bit + Parity als 8 Bit ohne Parity empfängt, dann ist das Paritybit das Bit 7.
Mhh, und jetzt nochmal für doofe warum kriege ich mit hterm und mit zterm einen output so wie ich will und mit cat nicht?
Weil in einem Fall Deine serielle Schnittstelle anders konfiguriert wird als im anderen.
Okay wie kriege ich das unter Linux hin, das der Output so aussieht wie ich will? es muss doch irgendwie gehen? Gruß kami
mhh damit komme ich jetzt gar nicht klar. Verstehe nicht wie und was ich da einstellen soll? Gruß kami
So aus dem Ärmel geschüttelt würde ich 9600 7E1 so setzen: stty -F DEIN_TTYS_DEVICE 9600 cs7 parenb parodd
Mist, vertippt: stty -F DEIN_TTYS_DEVICE 9600 cs7 parenb -parodd
okay, das habe ich schon probiert der Output sieht immer noch gleich aus. und stty -a liefert: speed 9600 baud; rows 0; columns 0; line = 0; intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>; min = 0; time = 16; parenb parodd cs7 -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 Gruß kami
Okay auch bei dem -parodd sieht der Output noch identisch aus. Gruß kami
> okay hier ist der Output: > > 00000000 af c5 53 59 35 d1 33 44 41 b1 30 30 b4 a0 56 33 Wenn cs7 bei stty angegeben wird, dann sollte das nicht rauskommen können. af, d1, b1 und b4 sind offensichtlich größer als 7f und damit nicht mit 7 Bit darstellbar. Da ist dann irgendwas kaputt, entweder lässt der Treiber der seriellen Schnittstelle auf dem System keine 7 Bit Wortlänge zu, oder stty ist doch anders aufgerufen worden. Eine mögliche Abhilfe wäre ein kleines Skript, das jedes Byte aus der mit cat /dev/ttyUSB0 > temp.data erzeugten Datei temp.data vom Bit 7 befreit und wiederum irgendwohin ausgibt. Die Unixkenner hier (ich bin keiner) werden wissen, wie das am geschicktesten geht.
Folgendes Skript löscht aus der Eingabe die hohen Bits. Damit kann ich tatsächlich deinen Hexdump dekodieren. Ist zwar nicht Produktionsreif, aber zum Debuggen reichts.
1 | #!/usr/bin/perl
|
2 | use strict; |
3 | |
4 | while(<>){ |
5 | chomp; |
6 | |
7 | my @l; |
8 | for ( unpack 'c*' ){ |
9 | $_ &= 0x7f; |
10 | push @l, $_; |
11 | }
|
12 | print pack("c*", @l), "\n"; |
13 | }
|
Ich glaube, dass entweder du für den stty nicht das richtige Device angibst, oder dass irgendein anderes Programm gleichzeitig an den Einstellungen herumpfuscht. Daher beende mal den von dir erwähnten screen, dein Perl-Program und alles andere, was auf die Schnittstelle zugreifen könnte und mach Folgendes in der Shell:
1 | ( stty sane raw 9600 cs7 -cstopb parenb -parodd ; cat ) < /dev/ttyUSB0 |
Plan B: Wenn dich die Parity und evtl.Übertragungsfehler nicht interessieren (unschön, wozu sich sonst die Mühe mit der Parity machen), dann ersetze mal das da in den obigen Aufruf:
1 | stty sane raw 9600 cs8 -cstopb istrip |
Die Kombination sagt: 8 Bit, aber lösche das oberste.
Hi, sorry das ich erst jetzt antworte, aber ich bin gerade erst von der Arbeit wieder gekommen. Also erstmal vielen Dank für die ganze Hilfe und Tipps. Ich habe mal alles getestet und das einzige was klappt ist: stty sane raw 9600 cs8 -cstopb istrip -F /dev/rfcomm0 Damit kriege ich wunderschön den Output mit cat /dev/rfcomm0 den ich möchte. Sieht super aus und ist alles drin. Nun möchte ich aber gerne die Daten mit einem Perlskript auswerten. Dafür nehme ich eigentlich das CPAN Module use Device::SerialPort; Hier mal mein Skript. Das klappt aber so noch nicht und müsste angepasst werden. Oder wie soll ich das machen??? use strict; use warnings; use Device::SerialPort; use POSIX; $| = 1; my $port = Device::SerialPort->new( "/dev/rfcomm0" ); $port->baudrate(9600); $port->databits(8); $port->stopbits(1); $port->parity("none"); $port->read_const_time(1000); $port->write_settings || undef $port; my $count=0; my $byte=""; while(1) { ($count,$byte)=$port->read(270); if ($count > 0) { print "$byte"; } } Vielen Dank. Gruß kami
Dann kann möglicherweise rfcomm keine 7-Bit-Übertragung. Aber das macht nichts, denn Du wirst auch in Perl an dieser Stelle
1 | while(1) { |
2 | ($count,$byte)=$port->read(270); |
3 | if ($count > 0) { |
4 | print "$byte"; |
das Bit 7 der empfangen Daten löschen.
Hi, danke für die Tipps. Leidr bin ich was das abschneiden von irgendwelchen Bits angeht nicht so gut. Könnte mir jemand vielleicht das Skript entsprechend anpassen? Vielen Dank. Gru0 kami
Ich nicht, ich hab bei Perl keinen Fuß in der Tür, das sieht mir meistens so aus, als wäre eine Katze über die Tastatur gelaufen.
Hehe, ja das Problem kenne ich. Vielleicht wäre ja jemand anderes so nett. Gruß kami
Das verwendete Perl-Modul Device::SerialPort hat laut Doku auch die Möglichkeit, das "istrip" zu setzen. Doku sagt:
1 | $PortObj->stty_istrip; |
Also einfach setzen und dann normal die Daten einlesen.
Vielen Dank. Problem gelöst läuft super :) Vielen Vielen Dank an alle hier. Gruß kami
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.