|
Hi everybody.
I need to communicate with an appliance, the
consolle port of which is linked to my RedHat 7.2 system's serial
port.
I started writing a Perl programs that uses the
basic filehandle syntax
open(PORTA, "+</dev/ttyS0");
... print PORTA $stringout; ... $answer = <PORTA>; I tested it connecting my serial port to a Windows
workstation running Hyperterminal, and it worked out ok!
Sadly, when I tried it on the needed connection, I got absolutely no response from the appliance. I blamed it on the different serial port
configuration requested by the appliance (9600 bps, 8-bit, 1-stop, no parity,
�flow control� = none), and so I turned to the more sophisticated
"Device::SerialPort" module, which should provide the right tools to set the
port parameters.
I tested it again using Hyperterminal but this
time, though I managed to get my strings sent, the replies I sent from the
Windows hyperterminal never reached my Linux PC...naturally, it didn't work with
the appliance either.
I must certainly be going wrong somewhere, but I
have no clue at all.
Could you please help?
I attach hereby the two versions of the program
(both of which read the strings that must be sent from an input text file) and
the script I used to set the port parameters.
Thank you very much in advance.
Best regards
Bruno |
serial_old.pl - The first version of the program ================================================
#!/usr/bin/perl -w
# Routines
# comunicate: adds a customary terminator to the string, which is then sent to
# the serial port, the standard output and the logfile; finally it reads the
# reply coming from the serial port and prints it on the standard output and
# the logfile
sub comunicate{
$terminator = "\n";
$stringout = $_[0].$terminator;
print PORTA $stringout;
print "Sent: $stringout\n";
print FOUT "Sent: $stringout\n";
ascspell($stringout);
$answer = <PORTA>;
print "Received: $answer\n";
print FOUT "Received: $answer\n";
ascspell($answer);
}
# ascspell: displays the ASCII codes for each character in a given string
sub ascspell{
@array = unpack("C*", $_[0]);
print "[";
foreach $ch (@array) {
print "$ch ";
print FOUT "$ch ";
}
print "]\n";
}
# Main
open(FIN,$ARGV[0])
or
die ("error opening input file because: $!");
@inner = <FIN>;
close(FIN);
open(FOUT, "+>serial_old.log");
open(PORTA, "+</dev/ttyS0");
foreach $riga (@inner)
{
chomp($riga);
comunicate($riga);
}
close(PORTA);
close(FOUT);
============
serconf.pl - The script that sets the port parameters and writes them to a config file
======================================================================================
#!/usr/bin/perl -w
use Device::SerialPort;
# Initialisation
$PortName="/dev/ttyS0";
$ConfigurationFileName="./ttyS0.conf";
$quiet=1;
$lockfile="./lock";
$PortObj = new Device::SerialPort ($PortName, $quiet, $lockfile)
|| die "Can't open $PortName: $!\n";
$PortObj->user_msg(ON);
$PortObj->databits(8);
$PortObj->baudrate(9600);
$PortObj->parity("none");
$PortObj->stopbits(1);
$PortObj->handshake("rts");
print "Given configuration\n\n";
print "Port Name: $PortName\n";
$baud = $PortObj->baudrate;
$parity = $PortObj->parity;
$data = $PortObj->databits;
$stop = $PortObj->stopbits;
$hshake = $PortObj->handshake;
print "B = $baud, D = $data, S = $stop, P = $parity, H = $hshake\n";
$PortObj->write_settings;
$PortObj->save($ConfigurationFileName) || warn "Can't save $ConfigurationFileName:
$!\n";
=========================================================================================
serial.pl - The Device::SerialPort version
==========================================
#!/usr/bin/perl -w
use Device::SerialPort;
# Routines
# comunicate: adds a customary terminator to the string, which is then sent to
# the serial port, the standard output and the logfile; finally it reads the
# reply coming from the serial port and prints it on the standard output and
# the logfile
sub comunicate{
$terminator = "\n";
$stringout = $_[0].$terminator;
print PORTA $stringout;
print "Sent: $stringout\n";
print FOUT "Sent: $stringout\n";
ascspell($stringout);
$answer = <PORTA>;
print "Received: $answer\n";
print FOUT "Received: $answer\n";
ascspell($answer);
}
# ascspell: displays the ASCII codes for each character in a given string
sub ascspell{
@array = unpack("C*", $_[0]);
print "[";
foreach $ch (@array) {
print "$ch ";
print FOUT "$ch ";
}
print "]\n";
}
# Initialisation
$cfgfile="./ttyS0.conf"; # created by serconf.pl
$PortObj= tie(*PORTA,'Device::SerialPort', $cfgfile)
|| die "Can't start $cfgfile\n";
my $name= $PortObj->alias;
my $baud = $PortObj->baudrate;
my $parity = $PortObj->parity;
my $data = $PortObj->databits;
my $stop = $PortObj->stopbits;
my $hshake = $PortObj->handshake;
print "Port: $name\nB = $baud, D = $data, S = $stop, P = $parity, H = $hshake\n";
# Main
open(FIN,$ARGV[0])
or
die ("error opening input file because: $!");
@inner = <FIN>;
close FIN;
open(FOUT, "+>serial.log");
foreach $riga (@inner)
{
chomp($riga);
comunicate($riga);
}
close PORTA || print "port close failed\n";
undef $PortObj;
untie *PORTA;
close FOUT;
-- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>
