Я недавно начал работать с 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
Re "Это заставляет меня поверить, что существует какая-то разница в разрешениях между запуском команды в CMD и ее запуском через' system() '.", Нет, нет. Тем более, что вы сказали Perl использовать 'cmd'! – ikegami
Я смущен, почему я могу получить доступ к COM4 в avrdude, используя командную строку, но не через perl, используя ту же команду ... Если у них одинаковые настройки разрешений, они не должны работать? – SuperTron
Я уже говорил, что разница не в Perl, а не в Perl, и спрашивает меня, какая разница между Perl, а не Perl, не продуктивна. – ikegami