Mit /dev/ttyI0 quatschen

Marco Anstett marco.anstett at okay.net
Tue Jul 27 22:23:27 CEST 1999


Hallo,

ich hab bis eben noch etwas rumprobiert. Allerdings war das ergebnis
immer das gleiche.

Ich hab hier mal mein Script drangehängt. Vieleicht fällt ja jemandem
ein Fehler auf:

Danke im voraus.
Marco

Script:

#!/usr/bin/perl -w

use POSIX qw(:termios_h);
use FileHandle;

my $send_id = chr(17) . chr(0) . chr(0) . chr(2) . chr(19);
my $extern_enable = chr(33) . chr(0) . chr(0) . chr(0) . chr(33);

my $serial=init_serial("/dev/ttyS0","2400");

#Ersten Befehl an externe Steuerung senden
syswrite($serial, $send_id, length($send_id));

#Antwort der Steuerung emfangen und auswerten
auswerten(get_reply());

#bis hierhin funktioniert alles so wie es soll

#Zweiten Befehl an externe Steuerung senden

syswrite($serial, $extern_enable, length($extern_enable));
auswerten(get_reply());

#dieses Mal erhalte ich nur einen Teil der ersten Antwort,
#konkret die letzten drei Byte (die erste Antwort umfasst insgesamt vier
Bytes)
#eigentlich sollte ich nur ein Byte zur Bestätigung des Befehls
erhlaten.


sub get_reply{
    my $data_in = "";
    my $buf = "";

    do{
 sysread($serial, $buf, 1);
        $count++;
    }while $buf eq "";
    $data_in = $buf;

    print "Count 1: $count\n";
    $count = 0;

    do{
 sysread($serial, $buf, 1);
 $count++;
 $data_in = $data_in . $buf
    }until $buf eq "";

    print "Count 2: $count\n";

    return $data_in;
}

sub auswerten{

    my $index = 0;
    my $data = $_[0];

    do{
        my $zeichen = substr($data, $index,1);
 my $hex_wert = ord($zeichen);
        print $hex_wert."  ";
        $index++;
    }until $index == length($data);
    print "\n";
}

sub init_serial {
    my($port,$baud)=@_;
    my($termios,$cflag,$lflag,$iflag,$oflag);
    my($voice);

    my $serial=new FileHandle("+>$port") || die "Could not open $port:
$!\n";

    #Flags in Terminos setzen, alle anderen werden auf '0' gesetzt
    $termios = POSIX::Termios->new();
    $termios->getattr($serial->fileno()) || die "getattr: $!\n";
    $cflag= 0 | PARENB | CS8 | CREAD | CLOCAL;
    $lflag= 0;
    $iflag= 0 | IGNBRK | IGNPAR;

    $oflag= 0;

    $termios->setcflag($cflag);
    $termios->setlflag($lflag);
    $termios->setiflag($iflag);
    $termios->setoflag($oflag);
    $termios->setattr($serial->fileno(),TCSANOW) || die "setattr: $!\n";

    eval qq[
      \$termios->setospeed(POSIX::B$baud) || die "setospeed: \$!\n";
      \$termios->setispeed(POSIX::B$baud) || die "setispeed: \$!\n";
    ];

    die $@ if $@;
    #Aenderungen sofort ausfuehren
    $termios->setattr($serial->fileno(),TCSANOW) || die "setattr: $!\n";


    $termios->getattr($serial->fileno()) || die "getattr: $!\n";
    for (0..NCCS) {
        if ($_ == NCCS) { last; }

        if ($_ == VSTART || $_ == VSTOP) { next; }

        $termios->setcc($_,0);
    }
    $termios->setattr($serial->fileno(),TCSANOW) || die "setattr: $!\n";


    return $serial;
}





More information about the Linux mailing list