AVRDUDE: SER_OPEN (): 无法打开设备“/dev/ttyACM0”:设备或资源忙。

21
我是 Linux Mint 用户,正在使用 Arduino Yun。我正在编译 Arduino 程序,之后上传到 Arduino Yun,但是出现了以下错误。您能帮助我吗?
10个回答

28

首先,您需要确保具有正确的读写权限,如此处所述,基本上输入以下命令:

$ sudo adduser <username> dialout
$ sudo chmod a+rw /dev/ttyACM0

'/dev/ttyACM0'是你的Arduino连接的端口,它应该在你的根目录的/dev文件夹中列出。

第二步:确定Arduino连接的端口并为此端口设置正确的权限后,需要运行以下命令。我不确定它的作用,也不确定它是否真正需要,但在多次上传时,它使上传工作正常。

$ sudo udevadm trigger

在这里找到了这个命令:http://starter-kit.nettigo.eu/2015/serial-port-busy-for-avrdude-on-ubuntu-with-arduino-leonardo-eth/

第三,上传有时会有时机和运气的挑战。保持按下重置按钮(有时要非常连续地按两次),同时按下Arduino程序的上传按钮。在某个时刻,它就会工作。当我不断更改代码中的小片段时,我的运气更好,因此当我点击“上传”时,它必须首先编译代码。

https://www.arduino.cc/en/Guide/Troubleshooting#upload

在一些计算机上,您可能需要按下复位按钮

我从未涉及过引导加载程序,也没有涉及ICSP引脚之类的(幸运的是)

还可以查看Arduino论坛您提供的链接


谢谢,这也是有用的链接。 - kafkas
非常好的链接,我已经将其添加到“答案”中以保证完整性,这样可以吗? - hewi

21

我在使用Leonardo开发板和Ubuntu时遇到了问题。添加规则让ModemManager忽略链接中提到的所有USB设备对我没有用。然而,删除modemmanager确实解决了问题。

sudo apt-get purge modemmanager


我认为有人应该提交一个上游错误报告 - 告诉调制解调器管理器不要继续尝试。 - Charles Lohr

12

对我来说一直有效的解决方案是进入 工具 -> 端口 -> /dev/ttyACMx 并再次单击所选端口。

之后,IDE 便可以顺利上传代码。


我猜,当你选择端口时,Arduino IDE会进行一些握手或类似的操作。有时候重新建立连接会有所帮助。但这只是一个假设。 - NonGrate
同意。现在我总是在编程Arduino之前仔细检查板子和IO口,这样它就能正常工作了。 - Alex Petty
我另一个假设是,现在我每天都看到这种情况,可能取决于你在重新选择端口后等待的时间。 也许IDE会不时地再试一次,偶尔会成功[x]。 尽管如此, 在多次上传失败后立即按下Ctrl+U键可以帮助[x]。 快速按下Ctrl+U键会使IDE运行到ConcurrentMidificationException,从而解决问题[x]。PS:在上传草图期间打开串行监视器始终会打开串行监视器,并始终将其连接到正确的端口/设备 - 有助于[x]。 - NonGrate

3
sudo chmod a+rw /dev/ttyACM0

首次上传,请运行以下命令


1

请确保您的USB数据线插入牢固。我的设备因为这个问题突然停止工作了。如果设备没有插入,它就不会被创建,因此会出现"/dev/ttyACM0未找到"的提示信息。


1

我想补充一个对我有效的新解决方案(同样在Linux Mint下)。我打开了串口监视器(从4个已打开的Arduino IDE中的一个),关闭它就解决了问题(可能与上面描述的进程问题有关)。


这对我也起作用了,只要关闭集成开发环境窗口即可。 - Rexcirus

0

当一个进程连接到我正在尝试通过screen或gtkterm加载代码的端口时,我会收到这个消息。

尝试使用以下命令:

lsof /dev/ttyACM3

使用ACM<x>来控制您的设备。如果出现任何问题,例如:

screen  8610  elm    5u   CHR  166,3      0t0 5599015 /dev/ttyACM3

然后杀掉该PID:

kill 8610

清除正在使用该端口的进程。

0

我认为更改端口权限不是一个好主意。我已经找到了更好的解决方案,那就是使用sudo运行Arduino。以下是如何操作的指南。首先,找到Arduino的.desktop文件。它可能在/usr/share/applications/或者~/.local/share/applications/中。名称也可能不同,但肯定包含“arduino”这个词。对于我来说,它在/usr/share/applications/arduino.desktop。然后使用sudo nano <your arduino.desktop file>打开它。对于我来说,sudo nano /usr/share/applications/arduino.desktop可以工作。它会包含类似下面的内容:

[Desktop Entry]
Type=Application
Name=Arduino IDE
GenericName=Arduino IDE
Comment=Open-source electronics prototyping platform
Exec=arduino %U
Icon=arduino
Terminal=false
Categories=Development;IDE;Electronics;
MimeType=text/x-arduino;
Keywords=embedded electronics;electronics;avr;microcontroller;
StartupWMClass=processing-app-Base

现在找到以 Exec= 开始的行。对我来说,它是 Exec=arduino %U。所有在 Exec= 之后的内容都是启动 Arduino 的命令,对我来说就是 arduino %U。我们需要使用 sudo 来运行此命令。然后在该命令之前键入 echo "<your password>" | sudo -S。最后使用 Ctrl+O 保存文件。现在 Exec 行应该类似于 Exec=echo "blahblah" | sudo -S arduino %U,其中 blahblah 是你的密码。完成了!现在应该可以正常工作了。如果不行,请尝试重新启动。但还有一个问题。现在,默认情况下,Arduino IDE 将把 sketches 保存在 /root/Arduino/,而不是应该保存在 /home/<username>/Arduino/。这并不好。但在 Arduino 的设置中很容易解决。此外,现在你几乎可以编辑系统中的所有文件。因此,请小心,不要破坏什么东西。

编辑:我之前说错了。使用sudo usermod -a -G uucp $USER 或者 sudo usermod -a -G dialout $USER,然后再执行reboot会更好。


0

我最近在使用本地编译的Arduino IDE版本1.8.16时,遇到了在Ubuntu 18.04.5 LTS机器上连接Genuine Arduino Mega 2560的问题。在我的情况下,我已经解决了这个问题,并在此分享一些技巧。

我发现有几个其他论坛主题报告了相同的症状(尽管不是所有都是Mega,也不是所有都在Linux上):

经过数小时的故障排除,我终于能够可靠地连接到我的Mega。原来有多个问题阻止了它的工作,必须理解和解决,当我意识到它们是什么时,我简直不敢相信自己的眼睛。

建议确保udev规则已配置以防止ModemManager独占Mega设备,从而使其无法使用Arduino IDE的海报是正确的。因此,我检查了我的/etc/udev/rules.d/70-snap.core.rules,并确认已经有一个规则让ModemManager忽略USB供应商ID为2341的设备,这是真正的Arduino:

...
ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"
...

然而,当我执行了tail -f /var/log/syslog并插入Mega时,我简直不敢相信自己的眼睛看到ModemManager仍在试图与它进行通信:

Dec  9 22:09:58 hostname ModemManager[999]: <info>  [device /sys/devices/pci0000:00/0000:00:14.0/usb3/3-2] creating modem with plugin 'Generic' and '1' ports
Dec  9 22:09:58 hostname ModemManager[999]: <warn>  Could not grab port (tty/ttyACM0): 'Cannot add port 'tty/ttyACM0', unhandled serial type'
Dec  9 22:09:58 hostname ModemManager[999]: <warn>  Couldn't create modem for device '/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2': Failed to find primary AT port

看起来ModemManager仍在尝试将其连接为非USB TTY设备。

问题加剧的是,Arduino IDE没有优雅地处理这个问题,即使我从USB中拔掉了Mega,它仍然一直挂起并尝试连接。不过,我快速执行了ps -ef | grep ModemManager,然后kill [PID],等待Arduino IDE停止尝试连接已断开的Mega,然后重新插入,通过“工具”->“端口”指定端口,再次尝试上传,结果就像魔法一样顺利。(相反,如果我只是等待观察/var/log/syslog,让ModemManager放弃并释放设备,Arduino IDE也可能会在我明确杀死ModemManager的情况下工作。这可能解释了为什么它偶尔能够正常工作。)

然后我以为我解决了所有问题,开始将Mega螺栓固定到我的设备上。我紧固连接件,又不敢相信自己的眼睛,它又停止工作了。我把Mega拿出来,卸下整个电路板,现在它可以工作了,再次固定它,它又停止工作了。经过几轮尝试,发现在A6引脚旁边的孔上使用黄铜支架会导致这个问题。我推测金属支架可能会短路或干扰非常靠近该孔的PCB线路。所以我停止在那个孔上螺栓固定,Mega在组装到我的设备中后就正常工作了。

所以在我的情况下,有两个问题阻止了Mega工作和通过USB连接到它的PC:

(1) ModemManager在插入设备后立即占用了它,尽管已经设置udev USB规则。解决方案-杀死ModemManager(仍需要研究修改系统配置,以便每次不必杀死它)。

(2) 金属支架与A6引脚旁边的PCB线路干扰的硬件问题。解决方案-停止在那个孔上螺栓固定。

希望这有所帮助。


-1

使用

sudo arduino

这将为一次性修复


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