2012-05-10 92 views
1

我在Windows上运行Perl有点新,在尝试运行avrdude.exe以将HEX文件上传到Atmel微控制器时,系统命令出现了一些问题。这是我用来执行命令的命令的Perl:Perl系统()EXE权限?

$AVR_CMD = "\"".$AVR_DUDE."\"" . " -C" . "\"".$AVR_DUDE_CONF."\""; 
$AVR_CMD .= " -v -v -v -v -patmega2560 -cstk500v2"; 
$AVR_CMD .= " -P\\\\.\\".$PORT; 
$AVR_CMD .= " -b115200 -D -Uflash:w:". "\"".$HEX_FILE."\"". ":i"; 

system($AVR_CMD); 

现在,我打印了最后的命令,以确保它是确定的,而且它似乎是。但是,在实际执行中似乎存在某种权限问题。当我复制并粘贴印刷命令到窗口终端,它导致这样的:

avrdude.exe: Version 5.11, compiled on Sep 2 2011 at 19:38:36 
     Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ 
     Copyright (c) 2007-2009 Joerg Wunsch 

     System wide configuration file is BLOCKED FOR SO 

     Using Port     : \\.\COM4 
     Using Programmer    : stk500v2 
     Overriding Baud Rate   : 115200 
avrdude.exe: Send: . [1b] . [01] . [00] . [01] . [0e] . [01] . [14] 
这是显然AVRDUDE正在使用正确的参数运行

。然而,当我运行使用system()此命令,我收到这样的输出:

avrdude.exe: Version 5.11, compiled on Sep 2 2011 at 19:38:36 
     Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ 
     Copyright (c) 2007-2009 Joerg Wunsch 

     System wide configuration file is BLOCKED FOR SO 

     Using Port     : \\.\COM4 
     Using Programmer    : stk500v2 
     Overriding Baud Rate   : 115200 
avrdude.exe: ser_open(): can't open device "\\.\COM4": Access is denied. 
avrdude.exe done. Thank you. 

这使我相信,有某种在运行CMD命令,并通过system()运行它之间权限的差异。如果有人可以提供一些有关这方面的见解或给我任何提示来解决这个问题,将不胜感激。事先感谢。 (基于一些代码this线程),我写了一个Perl脚本,发硬复位到爱特梅尔后调用avrdude.org:

编辑

#!/usr/bin/perl -w 
use Win32::SerialPort qw(:STAT 0.19); 
use FindBin qw($Bin); 

#Do port reset 
foreach (@ARGV) 
{ 
    if ($_ =~ /-P\\\\\.\\(.*)/) 
    { 
     print "Found -P argument - "; 
     print ("Resetting DTR on " . $1 . "\n"); 
     $P1 = new Win32::SerialPort ($1); 
     $P1->pulse_dtr_on(1000);  
     last; 
    } 
} 

select(undef, undef, undef, 0.1); 
print ("Executing avrdude\n"); 
system($Bin . "/avrdude.org " . join(" ", @ARGV)); 

然而,这仍然有同样的问题。如果Perl system()调用与通过命令行运行的权限相同,那么为什么我可以在命令行中执行该命令,但是当我从Perl调用相同的EXE时,COM4访问受到限制? :S

+1

Re“这使我相信在CMD中运行一个命令并通过'system()'运行它之间存在某种权限差别。”“不,没有。特别是因为你告诉Perl使用'cmd'! – ikegami

+0

我很困惑,为什么我可以使用命令行访问avrdude中的COM4,但不能通过perl使用相同的命令......如果它们具有相同的权限设置,它应该不工作? – SuperTron

+1

我已经说过,区别不在于Perl和Perl之间,而是问Perl和Perl之间的区别是什么,并不是有效的。 – ikegami

回答

1

system可以采用字符串参数,就像您一样,或参数列表。在后者(推荐)情况下,shell会为您处理引用。所以,只需制作一个参数列表并传递它即可。例如:

my @args = ($AVR_DUDE, " -C", $AVR_DUDE_CONF, 
      qw(-v -v -v -v -patmega2560 -cstk500v2), "-P\\.\.$PORT", 
      qw(-b115200 -D -Uflash:w:), $HEX_FILE, ":i"); 
system(@args); 

请注意,您不需要将变量放在双引号之外。并且您可以使用其他引用方法来避免必须转义引号。例如: -

"\"" 

可以在任何这些形式写成:

'"' 
qw(") 
q(") 
qq(") 
q#"# # etc 

perldoc perlop以获取更多信息。

+0

感谢您的反馈,请参阅我的编辑问题。 – SuperTron

1

我怀疑你的问题可能在引用命令行的参数。

我试图模仿你的环境在你没有显示所有变量的内容:

use strict; 
use warnings; 

my $AVR_DUDE = 'avrdude.exe'; 
my $AVR_DUDE_CONF = 'my-conf'; 
my $PORT = 'COM4'; 
my $HEX_FILE = 'file.hex'; 

my $AVR_CMD; 
$AVR_CMD = "\"".$AVR_DUDE."\"" . " -C" . "\"".$AVR_DUDE_CONF."\""; 
$AVR_CMD .= " -v -v -v -v -patmega2560 -cstk500v2"; 
$AVR_CMD .= " -P\\\\.\\".$PORT; 
$AVR_CMD .= " -b115200 -D -Uflash:w:". "\"".$HEX_FILE."\"". ":i"; 

print "$AVR_CMD\n"; 

这里是输出:

"avrdude.exe" -C"my-conf" -v -v -v -v -patmega2560 -cstk500v2 -P\\.\COM4 -b115200 -D -Uflash:w:"file.hex":i 

请问当你把它粘贴在指挥工作CMD?

如果没有,您将不得不修复报价。我怀疑-C"my-conf"可能是错的。尝试-C "my-conf""-Cmy-conf"