2012-05-10 2 views
1

Я недавно начал работать с 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(). Если бы кто-нибудь мог предложить какое-то представление об этом или дать мне какие-либо советы по исправлению этой проблемы, было бы весьма полезно. Спасибо заранее.

EDIT: Я написал скрипт на Perl, который вызывает avrdude.org после отправки жесткого сброса на Atmel (на основе некоторого кода в this потоке):

#!/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() имеет те же разрешения, что и в командной строке, то почему я могу выполнить команду в командной строке, но доступ COM4 ограничен, когда я вызываю тот же EXE из Perl? : S

+1

Re "Это заставляет меня поверить, что существует какая-то разница в разрешениях между запуском команды в CMD и ее запуском через' system() '.", Нет, нет. Тем более, что вы сказали Perl использовать 'cmd'! – ikegami

+0

Я смущен, почему я могу получить доступ к COM4 в avrdude, используя командную строку, но не через perl, используя ту же команду ... Если у них одинаковые настройки разрешений, они не должны работать? – SuperTron

+1

Я уже говорил, что разница не в Perl, а не в Perl, и спрашивает меня, какая разница между Perl, а не Perl, не продуктивна. – ikegami

ответ

1

system может принимать либо строковый аргумент, как вы, либо список аргументов. В последнем (рекомендуемом) случае оболочка обрабатывает цитату для вас. Итак, просто создайте список аргументов и передайте их. Что-то вроде этого:

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

Я подозреваю, что ваша проблема может заключаться в цитировании аргументов командной строки.

Я пытался имитировать Environnement, как вы не показывают содержание всех переменных:

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".

Смежные вопросы