Re: Mit /dev/ttyI0 quatschen
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; }
Teilnehmer (2)
-
Florian Lohoff
-
Marco Anstett