I have a BotBoarduino (a Duemilanove with a few extras) that I'm trying to communicate with using a Perl script. If I open the Serial Monitor from the Arduino IDE, I can send and receive data without a problem. Following this, my Perl script can communicate without any problems. However, if the Arduino is disconnected then reconnected to the PC, the Arduino doesn't seem to listen to commands sent from my Perl script until Serial Monitor is opened again.
I also tried using PuTTY to communicate with the Arduino, and this works the same way as Serial Monitor from the Arduino IDE - the Arduino doesn't listen to my Perl script until the connection has been opened once.
Here is a sample of the way I'm communicating with the Arduino using Perl:
#!perl -w
use Win32::SerialPort;
my $PortName = "COM4";
my $sendData = "c";
### SERIAL PORT SETUP ###
my $PortObj = new Win32::SerialPort($PortName) or die "Can't open $PortName: $^E\n";
$PortObj->baudrate(115200);
$PortObj->parity("none");
$PortObj->databits(8);
$PortObj->stopbits(1);
#$PortObj->dtr_active(1);
#$PortObj->rts_active(0);
#$PortObj->handshake("xoff");
$PortObj->lookclear();
$PortObj->write($sendData);
$PortObj->close();
I have commented out the dtr_active, rts_active and handshake bits. I played around with these settings as they were mentioned as possible culprits somewhere.
Does anyone have any suggestions for the settings needed to get the Arduino to listen to my Perl program without having to open PuTTY/Serial Monitor first?
You are probably being bit by the "bootloader delay eats serial input" bug. Delay two seconds in your perl script after opening the serial port before writing to it and your script will probably be happy.
When your perl script opens the port, the Arduino resets. During the reset, the bootloader is in control, listening for the command to start an upload. When you send data to the serial port right after opening the port, it ends up being ignored by the bootloader because your program isn't running yet.
Best practice would be to listen for a string from the Arduino to let you know your program is up and going.
I added a 5 second delay (to be safe), but the Arduino still doesn't seem to listen to my Perl program. I have the auto-reset disabled, so I don't think the bootloader is started again when I open the Serial port.
The Serial Monitor application sets all the right settings for opening the serial port. Apparently, your perl script does not. When the Serial Monitor corrects the missing settings, communications happens.
There have been numerous threads about how to use perl to write to the serial port. I know that at least one of them touched on exactly what was missing from the usual attempts to open the serial port. Since I don't use other than Windows, and the problem you are having can not be reproduced on Windows (since, on Windows, two applications can not open the same serial port), I didn't bookmark the thread. But, you should be able to search for it.
My problem was that I was not saving the serial port settings in my Perl script. I did indeed find this suggestion in an older thread after doing an exhaustive search (http://arduino.cc/forum/index.php/topic,21051.0.html). It was on the last page of search results, which I don't think I got up to the first time I searched the forums for a solution. Thanks for the suggestion PaulS and kicking my butt into gear to search for longer.
Here is my short Perl test script that works without having to open Serial Monitor/PuTTY:
#!perl -w
use Win32::SerialPort;
use strict;
use warnings;
$| = 1; #enable autoflush
my $PortName = "COM4";
my $sendData = "o";
### SERIAL PORT SETUP ###
my $PortObj = new Win32::SerialPort($PortName) or die "Can't open $PortName: $^E\n";
$PortObj->baudrate(57600);
$PortObj->parity("none");
$PortObj->databits(8);
$PortObj->stopbits(1);
$PortObj->write_settings(); #very important!
$PortObj->write($sendData);
$PortObj->close() || warn "\nClose failed\n";
Hopefully this will be of use to someone - maybe me in a few years time when I forget what I did.