Serial line I/O, I404, BPM, sysopen( $path, O_RDWR) , select()

The following script communicates with the I404 BPMs.

 
#!/usr/bin/perl -w
use strict;
use POSIX qw(:termios_h);
use FileHandle; 
my $buffer= " " x 200;
my ($nfd); 

#
# root> chmod 666 /dev/ttyS0
#
sysopen( I404, "/dev/ttyS0", O_RDWR) or die 'Failed to open /dev/ttyS0';

my $fd = fileno( I404); 
my $term = POSIX::Termios->new;     
$term->getattr( $fd);
$term->setospeed( 4098);  # B115200
$term->setispeed( 4098); 
my $lflag = $term->getlflag(); 
$term->setlflag( $lflag & ~(POSIX::ECHO));
my $c_cflag = $term->getcflag(); 
$term->setcflag( $c_cflag | &POSIX::CS8); 
$term->setattr( $fd, &POSIX::TCSANOW);

print " enter 'bye' to exit \n";
while()
{
    print " Enter> ";
    $buffer = <>; 
    goto finish if( $buffer =~ /bye/i); 
    if( length( $buffer))
    {
	syswrite( I404, $buffer, length( $buffer), 0);
    }
    $nfd = 1;
    while( $nfd)
    {
	my $rin = my $win = my $ein = ""; 
	vec( $rin, fileno( I404), 1) = 1; 
	$ein = $rin | $win;
	$nfd = select( $rin, $win, $ein, 0.1);
	if( $nfd)
	{
	    my $len = sysread( I404, $buffer, 100, 0);
	    $buffer =~ s/^\s*(.*?)\s*$/$1/; 
	    if( length( $buffer))
	    {
		print " len $len  $buffer \n"; 
	    }
	}
    }
}

finish:
close I404;