2012-05-10 12 views
1

私はWindows上でPerlを実行するのにちょっと新しく、avrdude.exeを実行して、HEXファイルをAtmelマイクロコントローラにアップロードしようとしているときにシステムコマンドにいくつか問題があります。私はそれがOKであることを確認するために、最後のコマンドを印刷しています、今Perl system()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); 

を、そしてあるように思わ:これらは、Perlは私がコマンドを実行するために使用していますコマンドです。しかし、実際の実行には何らかのパーミッションの問題があるようです。私は窓の端子に印刷されたコマンドをコピーして貼り付けると、それがこの結果に:明らかに正しいパラメータで実行されてAVRDUDEさ

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.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()を通してそれを実行している間の権限の違いのいくつかの並べ替えがあることを信じるように私をリード:私はsystem()を使用してこのコマンドを実行するときしかし、私はこの出力を受け取ります。誰かがこれに関するいくつかの洞察力を提供するか、この問題を改善するためのヒントを私に与えることができれば、それは非常に高く評価されるだろう。事前に感謝します。

EDIT:私はアトメルにハードリセットを送信した後avrdude.orgを呼び出すPerlスクリプトを書いた(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()コールがコマンドラインで実行しているのと同じ権限を持っている場合、なぜコマンドラインでコマンドを実行できますか?同じEXEをPerlから呼び出すとCOM4アクセスは制限されますか? :S

+1

Re "これは、CMDでコマンドを実行してから' system() 'で実行する場合に、ある種の権限の違いがあると考えています。 "、いいえ、ありません。特にPerlに 'cmd'を使うように言ったからです! – ikegami

+0

私は、コマンドラインを使ってavrdudeでCOM4にアクセスできる理由について混乱していますが、同じコマンドを使用している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

あなたの問題は、コマンドラインの引数を引用することが原因である可能性があります。

私はあなたがすべての変数の内容を示さなかったとして、あなたのエンバイロメントをシミュレートしてみました:

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

んあなたはそれを貼り付ける際に、作業を指揮:ここ

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

が出力されますCmd?

もしあなたが引用符を修正する必要があります。 -C"my-conf"が間違っている可能性があります。 -C "my-conf"または"-Cmy-conf"を試してください。

関連する問題