Forum: PC Hard- und Software Übertragungsunterschiede bei RS232?


von Stefan S. (kami)


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

von Stefan S. (kami)


Lesenswert?

Hi,

hat denn keiner einen Vorschlag woran das liegen kann?

Gruß kami

von Mike J. (emjey)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

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.

von Stefan S. (kami)


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

von Mike J. (emjey)


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.

von Stefan S. (kami)


Lesenswert?

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

von avion23 (Gast)


Lesenswert?

cat /dev/ttyUSB0 > temp.data
hexdump -C temp.data

oder online mit cat /dev/ttyUSB0 | hexdump -C

von avion23 (Gast)


Lesenswert?

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.

von Stefan S. (kami)


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

von Stefan S. (kami)


Lesenswert?

habe aber auf dem Server kein X laufen :)

Gruß kami

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Stefan S. (kami)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Weil in einem Fall Deine serielle Schnittstelle anders konfiguriert 
wird als im anderen.

von Stefan S. (kami)


Lesenswert?

Okay wie kriege ich das unter Linux hin, das der Output so aussieht wie 
ich will? es muss doch irgendwie gehen?

Gruß kami

von g457 (Gast)


Lesenswert?

man stty

von Stefan S. (kami)


Lesenswert?

mhh damit komme ich jetzt gar nicht klar.

Verstehe nicht wie und was ich da einstellen soll?

Gruß kami

von A.H. (Gast)


Lesenswert?

So aus dem Ärmel geschüttelt würde ich  9600 7E1 so setzen:

    stty -F DEIN_TTYS_DEVICE 9600 cs7 parenb parodd

von A.H. (Gast)


Lesenswert?

Mist, vertippt:

    stty -F DEIN_TTYS_DEVICE 9600 cs7 parenb -parodd

von Stefan S. (kami)


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

von Stefan S. (kami)


Lesenswert?

Okay auch bei dem -parodd sieht der Output noch identisch aus.

Gruß kami

von Rufus Τ. F. (rufus) Benutzerseite


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.

von A.H. (Gast)


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.

von Stefan S. (kami)


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

von Hä? (Gast)


Lesenswert?

Stefan S. schrieb:
> $port->databits(8);

hier haste aber schon mal 7 probiert?

von Stefan S. (kami)


Lesenswert?

ja habe ich selbes problem.

Gruß kami

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Stefan S. (kami)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Stefan S. (kami)


Lesenswert?

Hehe, ja das Problem kenne ich. Vielleicht wäre ja jemand anderes so 
nett.

Gruß kami

von A.H. (Gast)


Lesenswert?

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.

von Stefan S. (kami)


Lesenswert?

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
Noch kein Account? Hier anmelden.