Ask a Question related to PERL Modules, Design and Development.
-
Eric Schwartz #1
Loopback with Device::SerialPort?
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 Guest
-
Help compiling Device::SerialPort
I am trying to get Device::SerialPort working on Soalris 10. The build fails during the make stage. What's hapening is that, even though... -
Problems with Device-SerialPort
I'm trying to posr a perl application from FreeBSD to Soalris 10 X86. One of the key requirements of this application is communicating via the... -
problem with Device::SerialPort
Hi. I've been googling all afternoon now but wasn't able to find my problem mentioned someplace, but if for some reason my google-fu was weak,... -
Waiting for a char received by a serial port (Device::SerialPort)
Hello, I just did my first steps in programming perl today and got a "nearly" functioning program. What it should do: Send a file to /dev/ttyS0... -
Can't ping loopback
In article <00e101c348b8$9695ae00$a601280a@phx.gbl>, "jon" <szejdaj@exempla.org> wrote: The problem is almost certainly caused by a firewall...



Reply With Quote

