命令行Arduino编译和上传?

48

我如何在Mac和Linux命令行编译和上传Arduino的示例代码?我已经安装了Arduino编程环境。是否有示例makefile可以参考?


这个问题类似于Arduino StackExchange上的以下问题:http://arduino.stackexchange.com/questions/15893/how-to-compile-upload-and-monitor-via-the-linux-command-line - Metamorphic
13个回答

37

有一个名为Ino的命令行Arduino工具包,它只是这样做。


9
很遗憾,它已不再维护。 - Ugo Méda

16

从1.5.0版本开始,通过命令行(在Windows、Mac和Linux上)直接使用arduino可执行程序的标志支持编译和上传草图(而不是C/C++源代码)。

可以使用以下命令编译并上传ino文件:arduino --upload [sketch.ino]

文档


现在如何找到 arduino.exe - Dims
2
这启动了Arduino GUI。:( - Thom
这将启动GUI界面... - user171780

10
这是我的AVR项目GNU make包含文件,您可能需要调整其中一些内容以适应您的环境。它创建依赖关系,并具有我发现有用或优化大小的许多标准gcc选项,以及我使用的库目录。我成功地使用它来编译Arduino软件,我以前还曾经在Arduino编辑器中修改过PdePreprocessor,以便从命令行运行生成所有魔法。

https://github.com/wesen/mididuino/blob/master/app/src/processing/app/preproc/PdePreprocessor.java

#
# generic AVR makefile
#
# (c)  July 2011 - Manuel Odendahl - wesen@ruinwesen.com
#

# include this into your main Makefile, after having defined TARGET and TARGET_OBJS

all: $(TARGET).hex

CURDIR := $(dir $(lastword $(MAKEFILE_LIST)))
include $(CURDIR)MidiCtrl.mk

CC             = avr-gcc
CXX            = avr-g++
OBJCOPY        = avr-objcopy
AVR_ARCH       ?= atmega64
LDAVR_ARCH     ?= avrmega64
FLASH_PROTOCOL = jtag2

CFLAGS   += -Os -ffunction-sections -DAVR -I. -mmcu=$(AVR_ARCH) -mcall-prologues -fshort-enums -fpack-struct -Wall -Werror
CFLAGS   += -Wall -DLITTLE_ENDIAN -g -flto

CFLAGS += no-tree-loop-optimize -ffreestanding -morder1 -funsigned-char -funsigned-bitfields -fshort-enums -fpack-struct
CFLAGS += -fdata-sections -fno-split-wide-types -fno-inline-small-functions -mcall-prologues

CLDFLAGS += -Wl,--relax,--gc-sections -ffunction-sections
CLDFLAGS += -mmcu=$(AVR_ARCH)
LDFLAGS  = -m $(LDAVR_ARCH) -M

# generate list
# CFLAGS += -Wa,-adhlns=$@.lst

%.o: %.cpp
        $(CXX) $(CXXFLAGS) -c $< -o $@

%.o: %.c
        $(CC) $(CFLAGS) -c $< -o $@

%.o: %.s
        $(CC) $(CFLAGS) -c $< -o $@

%.s: %.c
        $(CC) -S $(CFLAGS) -fverbose-asm $< -o $@

%.o: %.S
        $(CC) $(CFLAGS) -c $< -o $@

%.syx: %.hex
        ihex2sysex $< $@

%.srec: %.elf
        $(OBJCOPY) -j .text -j .data -O srec $< $@

%.hex: %.elf
        $(OBJCOPY) -j .text -j .data -O ihex $< $@

%.ee_srec: %.elf
        $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@

AVR_BASE_DIR  ?= $(abspath $(CURDIR)..)
AVR_LIB_DIR   ?= $(AVR_BASE_DIR)/hardware/libraries

AVR_LIBS       += CommonTools Midi
AVR_LIB_DIRS   += $(foreach lib,$(AVR_LIBS),$(AVR_LIB_DIR)/$(lib))
AVR_INC_FLAGS  += $(foreach dir,$(AVR_LIB_DIRS),-I$(dir))
AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(wildcard $(dir)/*.cpp),$(subst .cpp,.o,$(file))))
AVR_OBJS       += $(foreach dir,$(AVR_LIB_DIRS),$(foreach file,$(filter-out $(AVR_HOST_EXCLUDE),$(wildcard $(dir)/*.c)),$(subst .c,.o,$(file))))
AVR_DEPS       += $(subst .o,.d,$(AVR_OBJS))

# AVR_HOST_EXCLUDE can be used to exclude specific files later on

CXXFLAGS += $(AVR_INC_FLAGS)
CFLAGS += $(AVR_INC_FLAGS)

CXXFlags += -Werror -Wall
CFLAGS += -Werror -Wall

default: all

%.d:%.c
        set -e; $(CC) -MM $(CFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

%.d:%.cpp
        set -e; $(CXX) -MM $(CXXFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

%.host.d:%.c
        set -e; $(CC) -MM $(CFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

%.host.d:%.cpp
        set -e; $(CXX) -MM $(CXXFLAGS) $< \
        | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@ ; \
        [ -s $@ ] || rm -f $@

printlibs:
        echo $(AVR_LIBS)

$(TARGET).elf: $(TARGET).o $(TARGET_OBJS) $(AVR_OBJS)
        $(CXX) $(CLDFLAGS) -g -o $@ $^

_clean:
        - rm *.elf *.hex *.o .midictrl.flags

libclean:
        rm -rf $(TARGET_OBJS) $(OBJS)

# concrete settings for development environment

UNAME=$(shell uname)
ISWIN=$(findstring CYGWIN,$(UNAME))
ISMAC=$(findstring Darwin,$(UNAME))

CC = avr-gcc
CXX = avr-g++
OBJCOPY = avr-objcopy
AVR_ARCH = atmega64
F_CPU = 16000000L
CORE = minicommand2

7

官方CLI工具

Arduino团队正在开发一个命令行界面客户端,你可以在https://github.com/arduino/arduino-cli找到它。

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

使用这个工具,你可以完成几乎所有的操作,从下载板子和库文件,到编译和上传代码。唯一缺少的是监视部分。

在Linux中,你仍然可以使用stty命令来配置端口,并使用cat命令来读取它。

stty -F /dev/ttyACM0 38400 # <-- Baud rate. The number in Serial.begin()
cat /dev/ttyACM0 # <-- Port

你可以使用 arduino-cli 命令找到端口。
arduino-cli board list

完整的指令在Github存储库和man页面中:

    $ 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.

5
您需要将Arduino程序转换为可行的cpp文件。Arduino环境会自动为您完成此操作。一个技巧是打开Arduino的preferences.txt文件(在Mac上是~/Library/Arduino,在Windows上可能在Documents and Settings或Application Data中,具体位置不确定),并设置build.verbose=true和upload.verbose=true。启动Arduino,编译您的程序(不要上传)。底部的控制台将显示已编译的文件。现在您可以进入该目录,其中包含cpp文件以及所有核心Arduino对象的已编译对象文件。您可以将它们复制到您的项目中,并使用cpp文件进行更多的修改。如果您需要有关Makefile的更多信息,请告诉我,我可以提供我所知道的内容。

10
告诉某人要启动图形界面才能使用命令行工具并不是一个有帮助的建议。 - Cerin
这个技巧只适用于Arduino 1.6或更高版本,如果您将build.path设置添加到首选项文件中(在Mac上为~/Library/Arduino15/preferences.txt)。首先创建build文件夹。例如:'build.path=/Users/user1/Documents/Arduino/build' - Elise van Looij

3
你可以使用 biicode(这是我正在开发的项目),它基于 CMake(但实际上不需要编写任何 cmake 文件),也是管理 Arduino 库的工具。
它的主要特点包括:
  • 依赖项解析,像 maven 一样进行传递性处理,但无需配置文件:直接从源代码中读取依赖项。
  • 中央仓库,任何人都可以上传他们的库。它们可以在网上探索、浏览和 发现
  • 版本控制:检查版本兼容性并允许安全更新依赖项。
  • 你可以在任何文本编辑器中使用它(它有可选的 eclipse 集成)。
  • 它管理项目设置和编译,并将生成的固件烧录到板子上。
你可以在这里看到一个快速演示,并在文档中阅读更多相关信息。

该项目现在已经转移到conan.io,但我不知道它是否仍然支持Arduino。我已不再参与。 - hithwen

3
您实际上可以使用Arduino GUI进行编译和上传,并在首选项中将编辑器设置为外部编辑器。这样,您就可以从xcode编辑C++(PDE)文件,并让Arduino生成实际的CPP并构建整个程序。
您还可以使用XCode编写纯粹的C++ / C以供Arduino使用,使用avr-gcc编译器。
请参阅:https://dev59.com/Tmsy5IYBdhLWcg3w-i_h#8192762 然后,您可以使用简单的avrdude上传工具来编程Arduino。请参阅:http://www.ladyada.net/library/arduino/bootloader.html 曾经,Arduino使用的协议是STK500协议的修改版,只有与Arduino捆绑在一起的avrdude才能说话。我不知道主流的avrdude是否已升级,或者您是否仍然需要使用Arduino文件夹内的avrdude。

2
如果您能使用CMake,则可以在同一网站上找到一些链接(例如这个这个)。 GNU makefile与CMake略有不同,但并不复杂。只需要稍微搜索一下,就可以找到许多Makefile示例,了解如何编译AVR代码。请注意保留HTML标签。

2
我使用platformio,非常喜欢它。它还有Visual Studio Code的扩展,因此您可以从那里完成所有操作。它内置了库管理器和上传器。
我的设置是一个NFS驱动器,在我的Linux笔记本电脑上挂载代码,并在靠近我的Arduino的树莓派上挂载。
当需要编译时,我在笔记本电脑上进行编译,由于RPi靠近Arduino,所以我从那里上传。
安装和配置后,基础知识很简单: 'platformio run'将编译您的代码。 'platformio run -t upload'将编译并上传。
我还有一个bash函数可以上传而不编译。
function th(){
    if [ "${1}" = "upload" ];then
    if [ ! -f platformio.ini ]; then
        echo platformio.ini not found
    else 
        UPLOAD_PORT=`cat platformio.ini | grep upload_port | awk '{print $3}'`
        if [ "${UPLOAD_PORT}" = "" ]; then
            echo no upload port
        else
            if [ "${2}" != "" ]; then
                FIRMWARE=${2}
            else
#the firmware location seems to have moved
#               FIRMWARE='.pioenvs/megaatmega2560/firmware.hex'
                FIRMWARE='.pio/build/megaatmega2560/firmware.hex'
            fi
            if [ -f "${FIRMWARE}" ]; then
                avrdude -v -p atmega2560 -C /home/stevenk/.platformio/packages/tool-avrdude/avrdude.conf -c wiring -b 115200 -D -P "${UPLOAD_PORT}" -U flash:w:$FIRMWARE:i
            else
                echo ${FIRMWARE} not found
            fi
        fi
    fi
    else 
            wget --timeout 8 -qO- http://192.168.178.212/$1
    fi
}

1
如果你不坚持使用make,也可以使用scons/sconstructscons/sconstruct。由于它基本上是用Python编写的,所以比make更容易调整。此外,它可以使用任何Python调试器进行调试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接