Perl serielle Schnittstelle

Remidemi

Remidemi

Routinier
Hallo

Ich möchte mit Perl Daten von einer seriellen Schnittstelle auslesen. Die Daten kommen aus einem Prüfgerät. Per Putty kann ich die COM Schnittstelle auslesen, es wird immer ein Datenstring bzw. eine Zeile ausgegeben bsp:
test 1234 test test
test 1234 test test

Mein Perl Scirpt zerreißt aber immer die Strings bsp:
te
st 123
4 te
usw.

Hier ein Auszug mit input()
Code:
use strict;
use warnings;
use Win32::SerialPort;



$| = 1;
my $port = Win32::SerialPort->new ('COM9');

  $port->databits(8);
  $port->baudrate(9600);
  $port->parity('none');
  $port->stopbits(1);
  $port->handshake("rts");

#$port->read_interval(100);
#$port->read_const_time(10);

START:
if ($data = $port->input) {
print $data;
print "\n";
}

goto START;
$port->close();
undef $port;

Und hier mit read:
Code:
use strict;
use warnings;
use Win32::SerialPort;



$| = 1;
my ($data, $num);
my $port = Win32::SerialPort->new ('COM9');

  $port->databits(8);
  $port->baudrate(9600);
  $port->parity('none');
  $port->stopbits(1);
  $port->handshake("rts");

#$port->read_interval(100);
#$port->read_const_time(10);

START:
($num, $data) = $port->read(100);
if ($num > 0) {
print $data;
print "\n";
}

goto START;
$port->close();
undef $port;

Hat jemand eine Idee? Wenn ich einen seriellen Scanner anschließe und etwas scanne werden die Daten richtig angezeigt.
 
Auch wenn das hier das Unixboard und nicht das Windowsboard ist... ;)

Es ist vollkommen normal, dass du die Daten stückweise bekommst. Du musst selbst so lange vom Device lesen, bis du eine ganze Zeile (also bis zum \n oder \r\n etc.) zusammen hast. Dafür sollte es aber eine Funktion wie getline() o. ä. geben (bin in Perl nicht so bewandert)...
 
also windowsboard hin oder her, goto ist ja schon mal so ziemlich das letzte. wie wär's mit "while ... $port->read " oder so. Ich kann das leider nicht ausprobieren, weil ich keine Windoofs Kiste habe. würde ja gerne helfen ;-)
 
Hi

@yai was hat Perl Programmierung mit Win/Unix zu tun?? Der einzige Unterschied ist ein anderes Modul und ein anderer Device Name, das wars..

@Tblue
Das hört sich toll an! Werde das am Montag nochmal angehen und hier melden.
 
Gelöst!

Code:
my @liste;
my $line;
my $data;
if ($data = $port->input) {
  $data =~ tr/ //s;
  push(@liste, $data);
  my $line = join("", @liste);
  sleep 1;
  if ($line =~ m/\n/) {
   print $line;
   
   undef @liste;
   undef $line;
   undef $data;
  }
}
 

Ähnliche Themen

Server und Client für TCP und UDP

Akonadi startet nicht mehr

NagiosGrapher 1.7.1 funktioniert nicht

Syslog verfeinern ?

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Zurück
Oben