C|B|
15.07.2005, 11:07
Salü @ll,
Kurz die Gegebenheiten:
Ich lese die Zustände (offen; Geschlossen) von 3 Schaltern aus. Diese Daten gehen an einen uP (Welcher einen Mitarbeiter Programmiert hat). Von da aus via rs232 weiter an ne Linux-Maschine.
Dort benutze ich Device::SerialPort (http://search.cpan.org/~cook/Device-SerialPort-0.12/SerialPort.pm) zum auslesen der Daten.
Das Problem:
Die Daten sind so aufgebaut:
[startzeichen][kennung][hex-wert][CR]
Zur Erläuterung:
Zuerst kommt ein Startzeichen. Dann ne Kennung, mit der ich erkenne, ob die Daten Digital oder analog eingelesen werden. Wir beschränken uns jetzt mal auf das digitale, in meinem Fall also 01.
Dann kommt ein Byte, welches mir einen Wert liefern soll.
Mein Terminal (windofs Rechner) gibt volgendes aus:
(Darstellung: ASCII-Zeichen, Dezimal-Wert, Binär-Wert)
S 83 01010011 // Startzeichen
1 00000001 // Kennung
ø 248 11111000 // Daten
13 00001101 // CR (Ende)
(Je nach Schalterkonstellation natürlich.)
Mein Bisheriges Perlprogramm:
#!/usr/bin/perl -w
use strict;
use vars qw( $ob $file );
use Device::SerialPort;
$file = 'ser.cfg';
$ob = Device::SerialPort->new ("/dev/ttyS0");
$ob->baudrate(115200);
$ob->databits(8);
$ob->parity("none");
$ob->stopbits(1);
$ob->handshake("none");
$ob->write_settings;
$ob->save($file);
$ob->start ($file);
$ob = Device::SerialPort->start ($file);
die "Can't open Serial Port from $file. $!\n" unless ($ob);
$ob->read_const_time(1000);
my (@out) = $ob->read(4);
foreach (@out) {
print "$_\n";
}
undef $ob;
Ausgabe:
4 //Parameter von read(<Bytes, die gelesen werden sollen>)
S
Das effektive Problem dabei:
Perl gibt genau das erste Byte aus (S) und dies noch als ASCII-Zeichen.
Ich weiss nicht, ob es ist, weil das 2. Zeichen in ASCII-Darstellung so gut wie gar nichts währe (Hex:00000001). Ich denke aber schon.
Lösungsansatz:
Entweder ich lese die Daten Binär oder Dezimal (Wahlweise Hexa-Dezimal) ein, oder ich bekomme das irgendwie hin, dass es mir nicht nach dem ersten Zeichen abhackt.
Aber ich hab eingesehen, dass ich das alleine nicht in absehbarer Zeit schaffe... I need help...
Danke fürs Lesen und vieleicht fürs Helfen ;)
Kurz die Gegebenheiten:
Ich lese die Zustände (offen; Geschlossen) von 3 Schaltern aus. Diese Daten gehen an einen uP (Welcher einen Mitarbeiter Programmiert hat). Von da aus via rs232 weiter an ne Linux-Maschine.
Dort benutze ich Device::SerialPort (http://search.cpan.org/~cook/Device-SerialPort-0.12/SerialPort.pm) zum auslesen der Daten.
Das Problem:
Die Daten sind so aufgebaut:
[startzeichen][kennung][hex-wert][CR]
Zur Erläuterung:
Zuerst kommt ein Startzeichen. Dann ne Kennung, mit der ich erkenne, ob die Daten Digital oder analog eingelesen werden. Wir beschränken uns jetzt mal auf das digitale, in meinem Fall also 01.
Dann kommt ein Byte, welches mir einen Wert liefern soll.
Mein Terminal (windofs Rechner) gibt volgendes aus:
(Darstellung: ASCII-Zeichen, Dezimal-Wert, Binär-Wert)
S 83 01010011 // Startzeichen
1 00000001 // Kennung
ø 248 11111000 // Daten
13 00001101 // CR (Ende)
(Je nach Schalterkonstellation natürlich.)
Mein Bisheriges Perlprogramm:
#!/usr/bin/perl -w
use strict;
use vars qw( $ob $file );
use Device::SerialPort;
$file = 'ser.cfg';
$ob = Device::SerialPort->new ("/dev/ttyS0");
$ob->baudrate(115200);
$ob->databits(8);
$ob->parity("none");
$ob->stopbits(1);
$ob->handshake("none");
$ob->write_settings;
$ob->save($file);
$ob->start ($file);
$ob = Device::SerialPort->start ($file);
die "Can't open Serial Port from $file. $!\n" unless ($ob);
$ob->read_const_time(1000);
my (@out) = $ob->read(4);
foreach (@out) {
print "$_\n";
}
undef $ob;
Ausgabe:
4 //Parameter von read(<Bytes, die gelesen werden sollen>)
S
Das effektive Problem dabei:
Perl gibt genau das erste Byte aus (S) und dies noch als ASCII-Zeichen.
Ich weiss nicht, ob es ist, weil das 2. Zeichen in ASCII-Darstellung so gut wie gar nichts währe (Hex:00000001). Ich denke aber schon.
Lösungsansatz:
Entweder ich lese die Daten Binär oder Dezimal (Wahlweise Hexa-Dezimal) ein, oder ich bekomme das irgendwie hin, dass es mir nicht nach dem ersten Zeichen abhackt.
Aber ich hab eingesehen, dass ich das alleine nicht in absehbarer Zeit schaffe... I need help...
Danke fürs Lesen und vieleicht fürs Helfen ;)