簡體   English   中英

C++ 系統(); function 未按預期工作/C++ 中的 Windows 控制台命令

[英]C++ System(); function not working as expected / Windows console commands in C++

堆棧溢出的友好人士您好!

我目前正在使用 Arduino Uno 進行項目。 因為我使用 c++ 程序創建了所有文件和草圖,所以我想從我的工作流程中消除 Arduino IDE。 為此,我可以很容易地使用 avrdude(IDE 無論如何都使用)和一些 windows 控制台命令。 這些是我正在使用的命令:

"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude" "-CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v - patmega328p -carduino -PCOM4 -b115200 -D -Uflash:w:C:\Users\Jzargo\AppData\Local\Temp\arduino_build_766345/EPaper_TestDither.ino.hex:i

“EPaper_TestDither.ino”是我要編譯和上傳的 arduino Sketch。 使用控制台並手動插入上述命令時,一切正常。

這是我正在努力的部分:

因為我也不希望用戶手動打開控制台並輸入一些亂碼,所以我想使用 system() 將此命令集成到我的 c++ 程序中; function:

system("\"C:\\Program Files(x86)\\Arduino\\hardware\\tools\\avr/bin/avrdude\" \" - CC:\\Program Files(x86)\\Arduino\\\hardware\\tools\\avr/etc/avrdude.conf\" -v -patmega328p -carduino -PCOM4 -b115200 -D -Uflash:w:C:\\Users\\Jzargo\\AppData\\Local\\Temp\\arduino_build_766345/EPaper_TestDither.ino.hex:i");

執行此function時,該命令無法執行,因為“Der Befehl "C:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden.",大致翻譯為“The Command "C:\Program" is notwritten or找不到”。

我不明白為什么控制台在手動插入命令時接受命令,但在使用 system() 時不接受; function。

我希望你能幫我解決這個問題。

編輯:通過使用subst H: "C:\Program Files(x86)\Arduino\hardware\tools\avr\bin"

system("\"H:/avrdude \"-CC:/Program Files (x86)/Arduino/hardware/tools/avr/etc/avrdude.conf\"\" -v -patmega328p -carduino -PCOM4 -b115200 -D -Uflash:w:C:/Users/Jzargo/AppData/Local/Temp/arduino_build_833906/EPaper_TestDither.ino.hex:i");

我能夠上傳我的草圖。 注意\"的更改位置。

但由於某種原因,當使用C:\Program Files(x86)\Arduino\hardware\tools\avr\bin而不是H:時,這不起作用。

最親切的問候

扎戈

該命令在參數方面看起來很混亂,盡管我不知道這究竟是如何觸發您的特定錯誤的。

開頭還行。 路徑被正確引用(雙引號,受 C 編譯器的反斜杠保護)。 但是為什么你混合了斜杠和反斜杠呢? 在一些在線示例中,我看到人們在 Windows 路徑中使用正斜杠( C:/whatever... ); 這似乎有效,並且比一直使用雙反斜杠更容易(但它不應該觸發您的 - 或任何 - 錯誤)。

所以system("\"C:\\Program Files(x86)\\Arduino\\hardware\\tools\\avr/bin/avrdude\"...應該調用正確可執行文件。你為什么不試試自己(不帶參數)看看錯誤是否仍然存在?

我懷疑\" - CC:\\Program Files(x86)\\...雖然不正確。avrdude 需要一個參數-C<path> ,而不是- C<path> (注意前后放置錯誤的空格破折號)。

順便說一句,引用包含有趣字符(如可能具有特殊含義的冒號)的參數可能沒有壞處。

對於這種麻煩的一般建議:

  • 使用不包含空格、括號或其他非標識符字符的路徑。 如果您不想更改 avrdude 安裝路徑,可以使用 DOS subst命令創建根為C:\Program Files(x86)甚至C:\Program Files(x86)\Arduino\hardware\tools\avr\bin的驅動器C:\Program Files(x86)\Arduino\hardware\tools\avr\bin ,例如subst H: "C:\Program Files(x86)\Arduino\hardware\tools\avr\bin" 該命令將是H:/avrdude :-)。
  • 如果遇到您不理解的錯誤,請從根本上簡化問題,直到玩具版本起作用; 然后一點一點地增加復雜性,直到遇到錯誤; 這應該更容易識別是什么觸發了它。

編輯:我不確定這個示例是否有效,因為我使用了 msys2 開發環境並在 bash shell 中運行示例; 我什至不確定cmd是否被系統調用稱為系統syste

為了檢查系統調用語義,我編寫了以下最小示例(使用混合斜杠/反斜杠作為測試)。 當前目錄有一個名為“some dir”的子目錄,其中包含一個最小程序 showargs ,它只是將其命令行參數寫入標准輸出:

 $ ls -l "some dir" && echo && cat cmdline.c && echo && gcc -o cmdline cmdline.c &&./cmdline.exe total 56 -rwxr-xr-x 1 Peter None 56097 Apr 16 17:23 showargs.exe #include <stdlib.h> int main(int argc, char **argv) { system("\".\\some dir/showargs\" 1 2 3"); } ->.\some dir/showargs<- ->1<- ->2<- ->3<-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM