如何通过Linux命令行进行编译,上传和监视?


19

在Fedora 21下,可以将Arduino Uno(上传等)与Arduino IDE(使用Fedora软件包)连接。

但是我宁愿使用vim + make + vim-quickfix-mode等。

我怎样才能做到这一点?

最好通过Fedora存储库中可用的工具。

我假设IDE调用外部命令行工具进行上传等。

与IDE的串行监视器等效的可能是将终端仿真器(例如screen)连接到/dev/ttyACM0,对吗?

也许有一个很好的示例项目可以看一下makefile?

Answers:


7

我建议谷歌搜索Makefile项目。我回想了一下Blink程序,基本上看到了IDE生成的内容并以更通用的方式复制了它。

#
# Simple Arduino Makefile
#
# Author: Nick Gammon
# Date: 18th March 2015

# where you installed the Arduino app
ARDUINO_DIR = C:/Documents and Settings/Nick/Desktop/arduino-1.0.6/

# various programs
CC = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-gcc"
CPP = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-g++"
AR = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-ar"
OBJ_COPY = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-objcopy"

MAIN_SKETCH = Blink.cpp

# compile flags for g++ and gcc

# may need to change these
F_CPU = 16000000
MCU = atmega328p

# compile flags
GENERAL_FLAGS = -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(F_CPU)L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106
CPP_FLAGS = $(GENERAL_FLAGS) -fno-exceptions
CC_FLAGS  = $(GENERAL_FLAGS)

# location of include files
INCLUDE_FILES = "-I$(ARDUINO_DIR)hardware/arduino/cores/arduino" "-I$(ARDUINO_DIR)hardware/arduino/variants/standard"

# library sources
LIBRARY_DIR = "$(ARDUINO_DIR)hardware/arduino/cores/arduino/"

build:

    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(MAIN_SKETCH) -o $(MAIN_SKETCH).o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/malloc.c -o malloc.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/realloc.c -o realloc.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WInterrupts.c -o WInterrupts.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring.c -o wiring.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_analog.c -o wiring_analog.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_digital.c -o wiring_digital.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_pulse.c -o wiring_pulse.c.o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_shift.c -o wiring_shift.c.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)CDC.cpp -o CDC.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial.cpp -o HardwareSerial.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HID.cpp -o HID.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)IPAddress.cpp -o IPAddress.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)main.cpp -o main.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)new.cpp -o new.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Print.cpp -o Print.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Stream.cpp -o Stream.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Tone.cpp -o Tone.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)USBCore.cpp -o USBCore.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WMath.cpp -o WMath.cpp.o
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WString.cpp -o WString.cpp.o
    rm core.a
    $(AR) rcs core.a malloc.c.o
    $(AR) rcs core.a realloc.c.o
    $(AR) rcs core.a WInterrupts.c.o
    $(AR) rcs core.a wiring.c.o
    $(AR) rcs core.a wiring_analog.c.o
    $(AR) rcs core.a wiring_digital.c.o
    $(AR) rcs core.a wiring_pulse.c.o
    $(AR) rcs core.a wiring_shift.c.o
    $(AR) rcs core.a CDC.cpp.o
    $(AR) rcs core.a HardwareSerial.cpp.o
    $(AR) rcs core.a HID.cpp.o
    $(AR) rcs core.a IPAddress.cpp.o
    $(AR) rcs core.a main.cpp.o
    $(AR) rcs core.a new.cpp.o
    $(AR) rcs core.a Print.cpp.o
    $(AR) rcs core.a Stream.cpp.o
    $(AR) rcs core.a Tone.cpp.o
    $(AR) rcs core.a USBCore.cpp.o
    $(AR) rcs core.a WMath.cpp.o
    $(AR) rcs core.a WString.cpp.o
    $(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(MAIN_SKETCH).elf $(MAIN_SKETCH).o core.a -lm
    $(OBJ_COPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $(MAIN_SKETCH).elf $(MAIN_SKETCH).eep
    $(OBJ_COPY) -O ihex -R .eeprom $(MAIN_SKETCH).elf $(MAIN_SKETCH).hex

ARDUINO_DIR至少需要进行更改,以反映IDE的安装位置。如果使用其他类似Wire库的东西,则需要对其进行某种程度的扩展以编译其他库。同样,您可以使用IDE自身生成的内容来指导您的更改。

上面带有前导空格的行将需要使用制表符而不是空格,这在Makefile中是正常的。


2
生成文件中的上载部分对于将编译后的草图上载到arduino(使用avr-dude)也很有用。
Gerben

那肯定是有用的。但是,到目前为止,IDE满足了我对编译和上传的需求,因此我并没有强烈的动机去研究如何做。:)
尼克·加蒙

看看“变形”答案,这是一个更简单的解决方案
Victor Lamoine

20

我使用命令行界面的arduino命令

我这样运行:

arduino --upload sketch/sketch.ino --port /dev/ttyUSB*

有一个页面描述了其他命令行工具,例如inotool。该页面还有一个示例Makefile。这些替代方法似乎很诱人,但在撰写本文时,显然没有一个可行。我假设这是由于它们所依赖的Arduino IDE发行文件中的一些最新更改。

arduino像上面那样运行有点慢,因为我猜它必须加载Java,但至少可以运行。arduino-builderArduino IDE发行版中还有一个命令。在撰写本文时,它对我的​​文档还不够完善,无法弄清楚如何使用它。例如,自述文件或我遇到的任何教程中都没有示例命令行,而且我不知道如何使用它将代码上传到板上。但是,大概它可以给我们带来比更快的编译速度arduino。自述文件还提到了能够重用先前编译的目标文件,因此具有一些类似make的功能。


要查看串行输出,我使用类似

stty -F /dev/ttyUSB* 1000000 raw -clocal -echo
cat /dev/ttyUSB*

数字1000000应该与您Serial.begin()在董事会代码中传递的数字匹配。您也可以使用screen,如果你有一个董事会程序,它是适当的互动,或者你可以使用任何工具直接写入到该设备。顺便说一下,我的Due显示为/dev/ttyACM0(而不是/dev/ttyUSB0Uno)。


1
确保*.ino目录中只有一个文件,因为它似乎不一定要上载该--upload参数提到的文件。
克里斯·斯特里钦斯基

5

您需要的是一个Makefile。Arduino周围有一些Makefile项目。搜寻“ Arduino Makefile”会返回许多结果,包括在Github上看起来不错的结果:https : //github.com/sudar/Arduino-Makefile

由于Arduino IDE处理库的方式,从命令行进行编译并非易事。

与IDE的串行监视器等效的可能是将终端仿真器(例如,屏幕)连接到/ dev / ttyACM0,对吗?

对于串行监视器,我建议使用minicom。它是命令行上的全功能终端仿真器(vt102)。

minicom -D /dev/ttyACM0 -b 115200

... 例如。


1
这个Makefile本质上是所接受答案的维护版本。GitHub上还有一个模板项目,向您展示如何进行设置:github.com/ladislas/Bare-Arduino-Project
Stefan van der Walt

2

如果您想为您的arduino项目提供一个完全兼容的解决方案(是的,您可以与仅使用普通Arduino IDE的其他人共享您的项目),则需要检查amake一个工具来简化arduino的cli,我将其与Geany结合使用,但是其他人将其与vi,Atom等一起使用。

它的灵感来自现在已经死了的Ino和Arturo项目;请花5分钟进行测试,并提供反馈。

使用示例:

cd ~/Arduino/Blink/
[move to your arduino project folder]

amake -v uno Blink.ino
[to compile/verify your code]

amake -u uno Blink.ino /dev/ttyUSB0
[to upload your code to an arduino connected via USB]

它里面有一些智能胶水,可以记住板子和文件,甚至可以自动检测板子的USB;因此,在成功执行“ amake -v”命令后,您可以在命令行上执行此操作,它将起作用。

amake -v
[to compile/verify your code]

amake -u
[to upload your code to an arduino connected via USB]

如果使用某些IDE宏,则可以轻松地编写和上传命令,例如使用Geany IDE,它将变为:

  • 编译/验证: cd%d; amake -v uno%f
  • 上传: cd%d; amake -u uno%f

安装后,仅运行“ amake”或“ amake -h”可以获得更多帮助。

而且,它可以支持您在Arduino IDE中安装/配置的每个开发板/库/编程器,是的,现代板如Adafuit Trinket M0 / Arduino M0等。

只需解雇您的Arduino IDE,前往董事会经理,安装支持,仅此而已,只需遵循一些简单的说明即可。

不支持您拥有的板?没问题,检测fqbn(读取README.md文件)并将其作为板名传递。

我正在寻找测试人员来增加数量或板别名,并自动检测适当的USB签名。

请记住,这是一个私有的工具,现在已经与公众共享,只是程序员为之痒痒……

干杯。


2

官方CLI工具

arduino团队正在开发cli客户端 https://github.com/arduino/arduino-cli

公告https : //blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/

从下载开发板和库,到编译和上传脚本,您几乎可以完成所有操作。现在缺少的是监视部分(你可以使用变质的方法使用stty cat,它的工作原理!)

命令与Metamorphic的答案非常相似,因为此工具是从该工具中分支出来的

说明在Github上回购和手册页:

    $ arduino-cli Arduino Command Line Interface (arduino-cli).

    Usage:   arduino-cli [command]

    Examples: arduino <command> [flags...]

    Available Commands:
      board         Arduino board commands.
      compile       Compiles Arduino sketches.
      config        Arduino Configuration Commands.
      core          Arduino Core operations.
      help          Help about any command
      lib           Arduino commands about libraries.
      sketch        Arduino CLI Sketch Commands.
      upload        Upload Arduino sketches.
      version       Shows version number of Arduino CLI.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.