use strict;
use warnings;
use Win32::SerialPort;
my $port = Win32::SerialPort->new('COM1')
    or die "Oops!\n";

$| = 1;

# Parameter setzen
$port->baudrate(110)	    || die "baudrate geht nicht\n";
$port->parity('none')	    || die "parity geht nicht\n";
$port->databits(8)        || die "databits geht nicht\n";
$port->stopbits(1)        || die "stopbits geht nicht\n";
$port->handshake("rts") 	|| die "handshake geht nicht\n";
# defined, weil "0" ein legaler Rueckgabewert ist
defined $port->parity_enable('T')	|| die "parity_enable geht nicht\n";

# Devicecontrolblock schreiben
$port->write_settings	    || die "write_setings geht nicht\n";

# Wartezeit fuer Lesen eines Zeichens
# Faustregel: Wert > 1000/Baudrate
$port->read_char_time(10);
# Wartezeit fuer Lese-Overhead
$port->read_const_time(1);

# String senden
my $string = "the quick brown fox jumps over the lazy dog\r\n";
$port->write($string);

# Daten einlesen, maximal 10 Leseversuche zulassen
my $Data = ReadData(10);
# gelesene Daten ausgeben
print $Data;

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


sub ReadData
  {
  # Eingabefunktion
  my $maxtries = shift;
  my $tries = 0;
  my $buffer = '';

  while ($tries < $maxtries)
    {
    # Daten lesen (Anzahl Daten, Datenstring)
    my ($num, $data) = $port->read(1);
    $buffer .= $data;        # Daten in den Puffer
    # falls keine Daten gelesen wurden, Versuche
    # hochzaehlen, andernfalls nullsetzen
    $tries = ($num == 0) ? $tries + 1 : 0;
    }
  return $buffer;
  }