Loopback with Device::SerialPort?


E

Eric Schwartz

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
 
Ad

Advertisements


Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top