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>