Perl a COM port (LONG)

Milan Pikula - WWW www na banan.napri.sk
Pondělí Leden 17 15:14:40 CET 2000


On Mon, 17 Jan 2000, Milan Sorm wrote:

W>Mon, Jan 17, 2000 ve 03:07:18PM +0100 Dominik Formanek napsal:
W># Ahoj,
W># 
W># mam takovy dotaz. Lze perlem ovladat COM porty ? Myslim treba nastaveni protokolu komunikace a tak...rychost...
W># 
W># Dominik
W>
W>ja to delam:
W>
W>system 'stty -neco....';
W>
W>--milan
W>
W>a funguje to pekne.

nechcel som pouzivat system(), tak som to spravil takto:

package ModemIO;

BEGIN {
}

# /usr/include/asm/ioctls.h
        $TCGETS = 0x5401;
        $TCSETS = 0x5403;
# /usr/include/asm/termbits.h

        $IGNBRK  = 0000001;
        $BRKINT  = 0000002;
        $IGNPAR  = 0000004;
        $PARMRK  = 0000010;
        $INPCK   = 0000020;
        $ISTRIP  = 0000040;
        $INLCR   = 0000100;
        $IGNCR   = 0000200;
        $ICRNL   = 0000400;
        $IUCLC   = 0001000;
        $IXON    = 0002000;
        $IXANY   = 0004000;
        $IXOFF   = 0010000;
        $IMAXBEL = 0020000;

        $OPOST   = 0000001;
        $OLCUC   = 0000002;
        $ONLCR   = 0000004;
        $OCRNL   = 0000010;
        $ONOCR   = 0000020;
        $ONLRET  = 0000040;
        $OFILL   = 0000100;
        $OFDEL   = 0000200;
        $NLDLY   = 0000400;
        $NL0     = 0000000;
        $NL1     = 0000400;
        $CRDLY   = 0003000;
        $CR0     = 0000000;
        $CR1     = 0001000;
        $CR2     = 0002000;
        $CR3     = 0003000;
        $TABDLY  = 0014000;
        $TAB0    = 0000000;
        $TAB1    = 0004000;
        $TAB2    = 0010000;
        $TAB3    = 0014000;
        $XTABS   = 0014000;
        $BSDLY   = 0020000;
        $BS0     = 0000000;
        $BS1     = 0020000;
        $VTDLY   = 0040000;
        $VT0     = 0000000;
        $VT1     = 0040000;
        $FFDLY   = 0100000;
        $FF0     = 0000000;
        $FF1     = 0100000;

        $CBAUD   =  0010017;
        $B0      =  0000000;
        $B50     =  0000001;
        $B75     =  0000002;
        $B110    =  0000003;
        $B134    =  0000004;
        $B150    =  0000005;
        $B200    =  0000006;
        $B300    =  0000007;
        $B600    =  0000010;
        $B1200   =  0000011;
        $B1800   =  0000012;
        $B2400   =  0000013;
        $B4800   =  0000014;
        $B9600   =  0000015;
        $B19200  =  0000016;
        $B38400  =  0000017;
        $CSIZE   =  0000060;
        $CS5     =  0000000;
        $CS6     =  0000020;
        $CS7     =  0000040;
        $CS8     =  0000060;
        $CSTOPB  =  0000100;
        $CREAD   =  0000200;
        $PARENB  =  0000400;
        $PARODD  =  0001000;
        $HUPCL   =  0002000;
        $CLOCAL  =  0004000;
        $CBAUDEX =  0010000;
        $B57600  =  0010001;
        $B115200 =  0010002;
        $B230400 =  0010003;
        $B460800 =  0010004;
        $B500000 =  0010005;
        $B576000 =  0010006;
        $B921600 =  0010007;
        $B1000000 = 0010010;
        $B1152000 = 0010011;
        $B1500000 = 0010012;
        $B2000000 = 0010013;
        $B2500000 = 0010014;
        $B3000000 = 0010015;
        $B3500000 = 0010016;
        $B4000000 = 0010017;
        $CIBAUD   = 002003600000;
        $CMSPAR   = 010000000000;
        $CRTSCTS  = 020000000000;

        $ISIG    = 0000001;
        $ICANON  = 0000002;
        $XCASE   = 0000004;
        $ECHO    = 0000010;
        $ECHOE   = 0000020;
        $ECHOK   = 0000040;
        $ECHONL  = 0000100;
        $NOFLSH  = 0000200;
        $TOSTOP  = 0000400;
        $ECHOCTL = 0001000;
        $ECHOPRT = 0002000;
        $ECHOKE  = 0004000;
        $FLUSHO  = 0010000;
        $PENDIN  = 0040000;
        $IEXTEN  = 0100000;

# /usr/src/linux/include/asm/termbits.h
        $struct_termios = 'IIIICCCCCCCCCCCCCCCCCCCC';

sub init {
        my $tmp1;
        my @tmp2;

        $line = $_[0];
        $speed = $_[1];
        open(MODEM, "+<$line") ||
        open(MODEM, "+</dev/$line") ||
        open(MODEM, "+</dev/tty$line") || return 0;

        my $tmp1;
        $tmp1 = pack ($struct_termios, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0);
        ioctl(MODEM, $TCGETS, $tmp1) || return 0;
        @tmp2 = unpack($struct_termios, $tmp1);
        $tmp2[0] = $IGNBRK;
        $tmp2[1] = 0;
        $tmp2[2] = $CS8 | $HUPCL | $CREAD | $CLOCAL | $SPEED;
        $tmp2[3] = 0;

        $tmp1 = pack($struct_termios, @tmp2);
        ioctl(MODEM, $TCSETS, $tmp1);

        return 1;
}

sub getchar {
        return getc MODEM;
}

sub getline {
        my $n = <MODEM>;
        $n =~ s/[\x0d\x0a]//g;
        return $n;
}

sub putline {
        my $msg;
        foreach $msg (@_) {
                print "Sending: $msg\n";
                print MODEM "$msg\r\n";
        }
}

sub expect {
        my $msg;
        my $lin;

        print "Expecting: @_\n";
        while (1) {
                $lin = getline();
                foreach $msg (@_) {
                        return 1
                                if ($lin =~ m/$msg/);
                }
        }
}

sub reset {
        print "Reseting modem\n";
        sleep 3;
        print MODEM "+++";
        sleep 3;
        putline "ATZ";
        expect "OK";
        putline "AT S7=45 S0=0 L1 V1 X3 \&c1 E1 Q0";
        expect "OK";
}

sub rcvdtmf {
        my $char;
        while (ord(getchar()) != 16) {}
        $char = getchar();
        return $char;
}

sub readall {
        print "Receiving:\n";
        while (<MODEM>) {
                print;
        }
}

1;


	Milan

--
Milan Pikula, WWW. Finger me for Geek Code.
http://fornax.elf.stuba.sk/~www, www na fornax.elf.stuba.sk
.. dajte mi pevnu linku a pohnem zemegulou ..




Další informace o konferenci Linux