[英]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>
(注意前后放置錯誤的空格破折號)。
順便說一句,引用包含有趣字符(如可能具有特殊含義的冒號)的參數可能沒有壞處。
對於這種麻煩的一般建議:
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.