Übertragungsunterschiede bei RS232?

OP #1982431
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
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.
Gast
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.
OP
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
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
> 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
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
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.