avrdude:ser_open():无法打开设备“/dev/ttyACM0”:设备或资源忙

Posted

技术标签:

【中文标题】avrdude:ser_open():无法打开设备“/dev/ttyACM0”:设备或资源忙【英文标题】:avrdude: ser_open(): can't open device "/dev/ttyACM0": Device or resource busy 【发布时间】:2017-04-18 12:23:41 【问题描述】:

我是 Linux Mint 用户。我正在处理 Arduino Yun。我正在编译 Arduino 程序。之后我正在上传到 Arduino Yun。然后我收到这些错误。你能帮帮我吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

$ sudo udevadm trigger

找到这个命令here: 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 forum 或链接provide by yourself

【讨论】:

谢谢,这也是一个有用的链接。 确实是非常好的链接,为了完整起见,我已将其添加到“答案”中,可以吗?【参考方案2】:

我的 Leonardo 板和 Ubuntu 确实有问题。添加规则告诉 ModemManger 忽略提到的链接中的所有 USB 设备对我不起作用。然而,实际上删除了modemmanager。

sudo apt-get purge modemmanager

【讨论】:

我认为有人应该提交上游错误报告 - 告诉调制解调器管理器不要继续尝试。【参考方案3】:

确保您的 USB 数据线已牢固插入。因为这个,我的突然停止了工作。出现“/dev/ttyACM0 not found”消息是因为除非插入设备,否则不会创建设备。

【讨论】:

【参考方案4】:

对我有用的解决方案始终是转到Tools -&gt; Port -&gt; /dev/ttyACMx 并再次单击所选端口。

IDE 上传代码后没有问题。

【讨论】:

我猜,当您选择端口时,Arduino IDE 会进行一些握手或类似操作。有时它有助于“重新启动”连接。但这只是一个假设。 同意。现在我总是在对 Arduino 进行编程之前仔细检查电路板和 IO,它运行良好。 我现在每天看到的另一个假设是,这可能取决于您(重新)选择端口后等待的时间。 Ma-a-aybe IDE 确实会时不时地重试一次,并且偶尔会成功 [x]。尽管如此,在多次上传失败后立即点击Ctrl+U - 有助于 [x]。点击Ctrl+U 快速将IDE 运行到ConcurrentMidificationException - 这解决了问题 - 有助于[x]。 PS:在草图上传期间打开Serial Monitor 总是会打开串行监视器并总是将其连接到正确的端口/设备 - 帮助 [x]。【参考方案5】:

使用

sudo arduino

这将修复一次

【讨论】:

【参考方案6】:
sudo chmod a+rw /dev/ttyACM0

第一次上传时运行以下命令

【讨论】:

【参考方案7】:

当一个进程连接到我试图用于加载代码的端口时,我收到此消息,例如screen 或 gtkterm。

试试这个命令:

lsof /dev/ttyACM3

为您的设备使用 ACM。如果出现问题,例如

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

然后杀死PID:

kill 8610

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

【讨论】:

【参考方案8】:

只是添加一个对我有用的新解决方案(也在 Linux Mint 下) 我打开了串行监视器(从打开的 4 个 arduino IDE 之一)并关闭它就可以了(可能与上面描述的过程问题有关)

【讨论】:

这对我也有用,只需关闭 IDE 窗口。【参考方案9】:

我不认为更改端口的权利是一个好主意。我找到了更好的解决方案。它是用 sudo 运行 Arduino。这是如何做到这一点的指南。首先,找到 Arduino 的 .desktop 文件。它可能位于/usr/share/applications/~/.local/share/applications/。名称也可能不同,但肯定会包含“arduino”。对我来说是/usr/share/applications/arduino.desktop。然后用sudo nano &lt;your arduino.desktop file&gt; 打开它。 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 %UExec= 之后的所有内容都是启动 Arduino 的命令。对我来说是arduino %U。我们需要用 sudo 启动这个命令。然后在该命令之前输入echo "&lt;your password&gt;" | sudo -S。并使用Ctrl+O 保存文件。现在Exec 行将类似于Exec=echo "blahblah" | sudo -S arduino %U,其中 blahblah 是您的密码。它已经完成了!现在它应该可以工作了。如果没有,请尝试重新启动。但是还有一个问题。现在,Arduino IDE 默认将草图保存在/root/Arduino/(它应该将草图保存在/home/&lt;username&gt;/Arduino/)。这不好。但它可以在 Arduino 的设置中轻松修复。现在您还可以使用 Arduino IDE 编辑系统中的几乎每个文件。所以要小心,不要破坏任何东西。

编辑:我错了。 sudo usermod -a -G uucp $USERsudo usermod -a -G dialout $USERreboot 效果更好。

【讨论】:

【参考方案10】:

我的 Genuine Arduino Mega 2560 尝试使用本地编译的 Arduino IDE 版本 1.8.16 从 Ubuntu 18.04.5 LTS 机器连接到它时遇到了这个问题。我能够在我的情况下修复它,所以在这里发布以分享提示。

遇到了几个报告相同症状的其他论坛主题(尽管并非所有主题都是 Mega 且并非都在 Linux 上):

https://arduino.stackexchange.com/questions/33505/why-do-i-get-avrdude-stk500v2-receivemessage-timeout-error-when-uploading-to?newreg=d5f1171d37394be584fc5de8dea6138f https://arduino.stackexchange.com/questions/3316/mega-2560-doesnt-respond https://forum.arduino.cc/t/mega2560-timeout-communicating-with-programmer/132479 https://starter-kit.nettigo.eu/2015/serial-port-busy-for-avrdude-on-ubuntu-with-arduino-leonardo-eth/

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

建议确保配置 udev 规则以防止 ModemManager 占用 Mega 设备,从而使其对 Arduino IDE 不可用的发帖人走在了正确的轨道上。所以我检查了我的/etc/udev/rules.d/70-snap.core.rules,确实确认已经有一条规则让 ModemManager 忽略 USB 供应商 ID 为 2341 的设备,即正版 Arduino:

...
ATTRSidVendor=="2341", ENVID_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 后,它仍然挂起并尝试连接到 Mega。尽管如此,我还是做了一个快速的ps -ef | grep ModemManager 然后kill [PID],等到 Arduino IDE 停止尝试连接到断开连接的 Mega,然后重新插入,通过“工具”->“端口”指定端口,然后再次尝试上传,它就像一个魅力。 (相反,如果我只是等待观看 /var/log/syslog 让 ModemManager 放弃并释放设备 Arduino IDE 可能在没有我明确杀死 ModemManager 的情况下也可以工作。这可能解释了为什么它偶尔会工作。)

然后我认为我解决了所有问题并开始将 Mega 固定到我的设备中。我拧紧连接紧固件,再次无法相信自己的眼睛再次停止工作。把 Mega 拿出来,松开整个电路板的螺栓,现在它可以工作了,用螺栓把它插回去,它就停止了工作。几轮后,将在引脚 A6 旁边的孔上使用黄铜支架与导致此问题相关联。我推测金属支架短路或以某种方式干扰了非常靠近该孔的 PCB 走线。所以不再用螺栓固定在那个孔中,Mega 开始正常工作,组装到我的设备中。

所以在我的例子中,有两个问题是阻止 Mega 工作并且 PC 无法通过 USB 连接到它:

(1) 尽管有 udev USB 规则,ModemManager 会在插入设备后立即占用设备。解决方案-杀死ModemManager(仍然需要研究修改系统配置,这样我就不必每次都杀死它)。

(2) 金属立管的硬件问题会干扰引脚 A6 旁边孔附近的 PCB 走线。解决方案 - 停止在那个孔中螺栓。

希望这有帮助。

【讨论】:

以上是关于avrdude:ser_open():无法打开设备“/dev/ttyACM0”:设备或资源忙的主要内容,如果未能解决你的问题,请参考以下文章

arduinoanroid的app与arduino的ch05,进行蓝牙通信遇到的问题

/dev/ttyACM0:openSUSE 权限被拒绝

usbtiny 不适用于 avrdude

为啥 avrdude 不闪现我的 attiny44?

新的 ATMEGA1281 和 avrdude

AVRDUDE 在 atmega32 上缓慢上传