Loopback with Device::SerialPort?

Discussion in 'Perl Misc' started by Eric Schwartz, Mar 18, 2005.

  1. This is cross-posted to .misc and modules, as I'm not certain where it
    belongs. Feel free to redirect the conversation to whichever group
    you feel is more appropriate.

    I'm trying to verify that I understand how to use Device::SerialPort
    on a Linux machine correctly by connecting two serial ports on the
    same machine with a crossover serial cable and sending data across the
    connection.

    The problem is that when the child process in the example below tries
    to issue its first read() call, I this this error message:

    Error #0 in Device::SerialPort::read at ./testserial line 42

    I have no idea what this means, and I can't find any information on
    what could cause this sort of error message anywhere in the
    Device::SerialPort docs. I'm appending my test program below-- it's
    not as small as I'd like, but most of that is the serial port setup
    code, which has to be in there (AFAIK).

    I've tried changing the code to use lookfor() in the child, with
    $port2->are_match($STOP_STRING), but that results in a read of 0 bytes
    and no error message.

    My code:

    #!/usr/bin/perl
    use warnings;
    use strict;
    use Device::SerialPort;
    use Digest::MD5 qw(md5_hex);

    my $port1 = Device::SerialPort->new("/dev/ttyS1");
    my $port2 = Device::SerialPort->new("/dev/ttyS2");

    for my $port ($port1, $port2) {
    $port->user_msg('ON');
    $port->baudrate(115200);
    $port->parity("none");
    $port->databits(8);
    $port->stopbits(1);
    $port->handshake('none');
    $port->write_settings || undef $port;
    }

    my $STOP_STRING = "Seriously dude, stop this, like now, even\n";

    chomp(my $uname = `uname -r`);
    open my $fh, "<", "/boot/vmlinuz-$uname" or die "Can't open kernel file: $!";
    if (my $pid = fork) {
    $port2->close();
    binmode($fh);
    my $accum;
    while(read($fh, my $buf, 255)) {
    $accum .= $buf;
    $port1->write($buf);
    }
    $port1->write($STOP_STRING);
    print "In parent, md5sum is: ", md5_hex($accum), "\n";
    $port1->close();
    waitpid($pid,0);
    } else {
    die "cannot fork: $!" unless defined $pid;
    close($fh);
    $port1->close();
    my $buf;
    while (1) {
    my ($count, $line) = $port2->read(255);
    next unless $count;
    last if $line eq $STOP_STRING;
    $buf .= $line;
    print "Child read $count bytes, total: ", length $buf , "\n";
    }
    $port2->close();
    print "In child, md5sum is: ", md5_hex($buf), "\n";
    exit;
    }
    __END__

    -=Eric
    --
    Come to think of it, there are already a million monkeys on a million
    typewriters, and Usenet is NOTHING like Shakespeare.
    -- Blair Houghton.
     
    Eric Schwartz, Mar 18, 2005
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    3
    Views:
    5,749
  2. Replies:
    0
    Views:
    460
  3. Keith Lee
    Replies:
    6
    Views:
    4,047
    Joe Smith
    Mar 31, 2008
  4. GracelessROB

    vhdl loopback

    GracelessROB, Jun 12, 2009, in forum: VHDL
    Replies:
    2
    Views:
    1,025
    GracelessROB
    Jun 14, 2009
  5. Hal Vaughan
    Replies:
    0
    Views:
    155
    Hal Vaughan
    Dec 9, 2005
Loading...

Share This Page