www.mikrocontroller.net

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


Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hat denn keiner einen Vorschlag woran das liegen kann?

Gruß kami

Autor: Mike J. (emjey)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike J. (emjey)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: avion23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cat /dev/ttyUSB0 > temp.data
hexdump -C temp.data

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

Autor: avion23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe aber auf dem Server kein X laufen :)

Gruß kami

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil in einem Fall Deine serielle Schnittstelle anders konfiguriert 
wird als im anderen.

Autor: Stefan S. (kami)
Datum:

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

Gruß kami

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man stty

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhh damit komme ich jetzt gar nicht klar.

Verstehe nicht wie und was ich da einstellen soll?

Gruß kami

Autor: A.H. (Gast)
Datum:

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

    stty -F DEIN_TTYS_DEVICE 9600 cs7 parenb parodd

Autor: A.H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, vertippt:

    stty -F DEIN_TTYS_DEVICE 9600 cs7 parenb -parodd

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay auch bei dem -parodd sieht der Output noch identisch aus.

Gruß kami

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#!/usr/bin/perl
use strict;

while(<>){
    chomp;
    
    my @l;
    for ( unpack 'c*' ){
  $_ &= 0x7f;
  push @l, $_;
    }
    print pack("c*", @l), "\n";
}


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:
( 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:
stty sane raw 9600 cs8 -cstopb istrip

Die Kombination sagt: 8 Bit, aber lösche das oberste.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hä? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan S. schrieb:
> $port->databits(8);

hier haste aber schon mal 7 probiert?

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja habe ich selbes problem.

Gruß kami

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann kann möglicherweise rfcomm keine 7-Bit-Übertragung. Aber das macht 
nichts, denn Du wirst auch in Perl an dieser Stelle
while(1) {
  ($count,$byte)=$port->read(270);
      if ($count > 0) {
      print "$byte";

das Bit 7 der empfangen Daten löschen.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan S. (kami)
Datum:

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

Gruß kami

Autor: A.H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das verwendete Perl-Modul Device::SerialPort hat laut Doku auch die 
Möglichkeit, das "istrip" zu setzen. Doku sagt:
$PortObj->stty_istrip;

Also einfach setzen und dann normal die Daten einlesen.

Autor: Stefan S. (kami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank.

Problem gelöst läuft super :)

Vielen Vielen Dank an alle hier.

Gruß kami

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.