0

我有一个BotBoarduino(一个带有一些附加功能的 Duemilanove),我正在尝试使用 Perl 脚本与之通信。如果我从 Arduino IDE 打开串行监视器,我可以毫无问题地发送和接收数据。在此之后,我的 Perl 脚本可以毫无问题地进行通信。但是,如果 Arduino 断开连接然后重新连接到 PC,则 Arduino 似乎不会监听从我的 Perl 脚本发送的命令,直到再次打开串行监视器。

我还尝试使用 PuTTY 与 Arduino 进行通信,这与 Arduino IDE 中的串行监视器的工作方式相同 - Arduino 在连接打开一次之前不会监听我的 Perl 脚本。

这是我使用 Perl 与 Arduino 进行通信的示例:

#!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();

我已经注释掉了dtr_active,rts_activehandshake位。我玩弄了这些设置,因为它们在某处被提及为可能的罪魁祸首。

另外,我使用了一个 120 欧姆的电阻来阻止 Arduino 自动重置,如此所述。

有没有人对让 Arduino 收听我的 Perl 程序而无需先打开 PuTTY/Serial Monitor 所需的设置有任何建议?

4

1 回答 1

1

原来我没有保存串行端口设置,如Arduino 论坛上的一个线程中所述。$PortObj->write_settings();设置串口参数后添加解决了这个问题。我的最终 Perl 代码是:

#!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";
于 2013-01-18T08:35:03.707 回答