我正在使用Perl脚本尝试与之通信的BotBoarduino(有一些额外内容的Duemilanove)。如果我从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_active
和handshake
位。我玩这些设置,因为他们被提到可能是某个地方的罪魁祸首。
此外,我使用120欧姆电阻来阻止Arduino自动重置,如here所述。
有没有人对Arduino收听我的Perl程序所需的设置有任何建议,而无需先打开PuTTY / Serial Monitor?
答案 0 :(得分:1)
原来我没有保存串口设置,如Arduino Forum上的线程所述。在设置串口参数后添加$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";