Go Down

Topic: Arduino doesn't listen to data sent via virtual serial port until Serial Monitor (Read 1 time) previous topic - next topic

m0nk3y


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:

Code: [Select]
#!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.

Also, I have used a 120 Ohm resistor to stop the Arduino from auto-resetting as described at http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection.

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?

billroy

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.

-br

m0nk3y

Thanks billroy, I'll give your suggestion a go later today and post the results.

m0nk3y

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.

Any other suggestions for what I could try?

PaulS

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.

Go Up