Übertragungsunterschiede bei RS232?

OP #1982431
Lesenswert?

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
OP #1984370
Lesenswert?

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
#1985041
Lesenswert?

@ 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.
OP #1985471
Lesenswert?

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
OP #1985585
Lesenswert?

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
Persönliche Seite #1985670
Lesenswert?

> 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.
Gast #1985723
Lesenswert?

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.
OP #1987006
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren