notepad++ 本身不带 avr 编译器,必须依赖 arduino-cli 或 avr-gcc 等外部工具链协同编译 .ino 文件;因 .ino 非标准 c++,需经预处理补全头文件、函数声明等,裸 avr-gcc 无法识别 digitalwrite() 等 arduino 特有符号,故推荐使用官方 arduino-cli 完成编译与上传。

Notepad++ 本身不带 AVR 编译器,运行 Arduino 代码必须靠外部工具链(arduino-cli 或 avr-gcc)+ 插件协同完成。直接点说:你写的 .ino 文件,得交给 Arduino 官方编译器或兼容的 AVR 工具链去处理,Notepad++ 只负责调用和展示结果。
为什么不能直接用 avr-gcc 编译 .ino 文件
.ino 不是标准 C++ 源文件,Arduino IDE(或 arduino-cli)会先做预处理:自动补全 #include <arduino.h></arduino.h>、合并多个 .ino 片段、生成函数声明等。裸 avr-gcc 遇到 digitalWrite() 或 loop() 就会报错 —— 它根本没见过这些符号。
- 常见错误现象:
error: 'digitalWrite' was not declared in this scope - 真正能编译
.ino的只有arduino-cli(推荐)或旧版arduino.exe --verify - 如果你硬要用
avr-gcc,得先把.ino手动转成.cpp,并显式包含所有依赖头文件、定义setup()/loop()、链接libarduino.a等 —— 工作量大且易出错
arduino-cli 是当前最稳的替代方案
官方 arduino-cli 已取代旧版 IDE 后端,支持命令行编译、上传、板卡管理,且与 Notepad++ 完全兼容。它比调用 arduino_debug.exe 更可靠(后者在新版 Windows 上常因权限或路径空格失败)。
- 安装:
arduino-cli下载地址见arduino.cc/en/software,解压后把目录加进系统PATH - 首次运行需初始化:
arduino-cli config init,然后arduino-cli core update-index,再装包:arduino-cli core install arduino:avr - 验证命令示例(存为 NppExec 脚本):
arduino-cli compile -b arduino:avr:uno -f "$(FULL_CURRENT_PATH)"
- 上传命令示例:
arduino-cli upload -b arduino:avr:uno -p COM3 -f "$(FULL_CURRENT_PATH)"
(注意替换COM3为你实际端口)
NppExec 脚本里最容易踩的坑
不是路径写错就是引号漏了,导致 $(FULL_CURRENT_PATH) 展开失败或空格截断 —— 这是 80% 编译失败的根源。
- 必须用双引号包裹
"$(FULL_CURRENT_PATH)",尤其路径含中文或空格时(如C:\My Projects\blink.ino) - 不要在脚本里写
cd切目录,arduino-cli自动识别当前文件所在位置 - 避免在脚本中拼接多行命令,NppExec 对换行敏感;如需多步操作(比如先清理再编译),用
&&连接,而非回车 - 端口名在 Windows 是
COMx,macOS 是/dev/cu.usbserial-*,Linux 是/dev/ttyACM0—— 脚本不能跨平台复用,得按系统单独配
语言高亮和自动补全只是表象
Notepad++ 的 Arduino 语法支持(XML + APIs)只管显示,不参与编译。它不会检查 pinMode(9, OUTPUT) 是否合法,也不会告诉你 Serial.begin(9600) 漏写了分号 —— 这些都得靠 arduino-cli 编译阶段暴露。
- 补全提示来自
Arduino_API.xml,内容固定,不随库更新(比如你装了Wire.h,但 XML 里没加Wire.begin()提示,就不会出现) - 真正可靠的错误定位,永远看 NppExec 控制台输出的第 1 行报错,而不是编辑器里的波浪线
- 如果控制台只显示
Process started >>>就停住,大概率是arduino-cli没装好,或脚本里路径/参数有不可见字符(比如中文全角空格)
复杂点在于:你得同时维护三套东西——Notepad++ 的插件状态、arduino-cli 的核心和库版本、硬件串口驱动。任一环节更新(比如 Windows 自动升级 CH340 驱动),都可能让上传突然失败,而错误信息往往藏在 20 行日志底部,不是一眼能看见的。











