终止引发“设备或资源忙碌”错误的进程:'/dev/ttyUSB0'?

23

我使用以下Python代码连接我的Arduino板。

device=glob.glob("/dev/ttyUSB*")[0]
time.sleep(1)
arduino = serial.Serial(device, 115200, timeout=5)

这通常可行,但在重新启动后,某些其他进程必须访问该板,导致出现错误:

serial.serialutil.SerialException:无法打开端口/dev/ttyUSB0:[Errno 16]设备或资源忙:'/dev/ttyUSB0'

当我拔下并重新插入USB插头时,可以正常执行Python代码,而不会出现错误。如何避免任何其他进程阻止该端口?以及如何找出此错误的原因?

3个回答

34
你可以使用。
$ fuser /dev/ttyUSB0

列出使用该文件的进程的PID。或者,如果您的fuser命令支持,则可以使用-k选项将它们杀死。


6
这种方法并不总是有效的。例如,如果你使用GNU screen访问了ttyUSBx设备,然后使用Ctrl-C退出,你将会收到"Device busy"的提示,但以上命令将不会显示该信息。 - gbmhunter
4
那我应该怎么修复它?!?! :D - 0xbaadf00d
你需要终止附加的屏幕会话。最好通过屏幕重新连接并正常关闭它,不理想的情况是通过终止拥有ttyUSB的屏幕进程来结束它。 - timB33

10

就我的情况而言

$ fuser /dev/ttyUSB0

之前没有工作(它什么也没显示)。

然而,以下内容是有效的:

$ sudo lsof /dev/ttyUSB0

这让我得到了一个使用我的串口的进程列表,我可以通过 PID(对应于列表中第二列)来轻松地 kill 它们。


1
sudo lsof /dev/ttyUSB0 对我也起作用了,谢谢! - Sean McCarthy
sudo fuser /dev/ttyUSB0 对我有用,谢谢。 - JoseleMG

0

运行:

$ ps ax

您将会看到哪个进程正在使用串口。结束该进程即可解决问题。


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