USB, I404

This script sets the terminal attributes for the I404:

#!/usr/bin/perl -w
use strict;
use POSIX qw(:termios_h);
use FileHandle; 

# syst:pass 12345
# syst:comm:term 1
# syst:comm:check 0

sub ascii_format
{
    my ($argin) = @_; 
    my $argout = ""; 
    foreach my $i ( 0 .. (length($argin) - 1))
    {
        my $let = substr( $argin, $i, 1); 
        my $dec = unpack( "C", $let); 
        if( $dec < 32)
        {
            if( $dec == 10){ $argout .= "<LF>";}
            elsif( $dec == 13){ $argout .= "<CR>";}
            else { $argout .= "<$dec>";}
        }
        else
        {
            $argout .= $let; 
        }
    }
    return $argout; 
}
my $buffer= " " x 200;
my ($nfd); 

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

my $fd = fileno( I404); 
  
my $term = POSIX::Termios->new;     
$term->getattr( $fd);
#$term->setospeed( 4098);  # B115200
#$term->setispeed( 4098); 
$term->setospeed( &POSIX::B19200);  # B19200
$term->setispeed( &POSIX::B19200); 
my $lflag = $term->getlflag(); 
$lflag = $lflag & ~(&POSIX::ECHO); 
$lflag = $lflag | &POSIX::ISIG | &POSIX::ICANON | &POSIX::IEXTEN;
$term->setlflag( $lflag);  
my $c_cflag = $term->getcflag(); 
$term->setcflag( $c_cflag | &POSIX::CS8); 
$term->setcc( VMIN, 1); 

my $iflag = $term->getiflag(); 
$iflag = $iflag & ~(&POSIX::IXOFF); 
$iflag = $iflag | &POSIX::ICRNL | &POSIX::IXON; 
$term->setiflag( $iflag); 

my $oflag = $term->getoflag(); 
$oflag = $oflag | &POSIX::OPOST; 
$term->setoflag( $oflag); 
$term->setattr( $fd, &POSIX::TCSANOW);
my $len; 
my $argout = ""; 
print " enter 'bye' to exit \n";
while()
{
    print " Enter> ";
    $buffer = <>;  
    $buffer =~ s/^\s*(.*?)\s*$/$1/; 
    goto finish if( $buffer =~ /bye/i); 
    if( length( $buffer))
    {
        $buffer .= "\n"; 
        $len = syswrite( I404, $buffer, length( $buffer), 0);
        print " write $len bytes " . ascii_format( $buffer) . "\n"; 
    }
    $nfd = 1;
    while( $nfd)
    {
        my $rin = my $win = my $ein = ""; 
        vec( $rin, fileno( I404), 1) = 1; 
        $ein = $rin | $win;
        $nfd = select( $rin, $win, $ein, 1.);
        print " nfd $nfd \n";
        if( $nfd)
        {
            $buffer = "";
            $len = sysread( I404, $buffer, 100, 0);
            print " --- len $len " . ascii_format( $buffer) . "\n"; 
            if( $len) 
            {
                $argout .= $buffer; 
            }
            $buffer =~ s/^\s*(.*?)\s*$/$1/; 
            if( $len == 1)
            {
                last;
            }
        }
    }
}

finish:
close I404;