PySerial 报告看似未使用的串行端口的“资源忙”

Posted

技术标签:

【中文标题】PySerial 报告看似未使用的串行端口的“资源忙”【英文标题】:PySerial Reporting 'Resource Busy' for seemingly unused serial port 【发布时间】:2019-12-10 18:22:55 【问题描述】:

我正在尝试使用 PySerial 打开与 USB 设备的串行连接,并且使用以下代码我收到以下错误:

import serial
ser = serial.Serial('/dev/tty.usbserial-EN270425')
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/serial/serialposix.py", line 265, in open
    self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
OSError: [Errno 16] Resource busy: '/dev/tty.usbserial-EN270425'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    ser = serial.Serial('/dev/tty.usbserial-EN270425')
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/serial/serialutil.py", line 240, in __init__
    self.open()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/serial/serialposix.py", line 268, in open
    raise SerialException(msg.errno, "could not open port : ".format(self._port, msg))
serial.serialutil.SerialException: [Errno 16] could not open port /dev/tty.usbserial-EN270425: [Errno 16] Resource busy: '/dev/tty.usbserial-EN270425'

我已检查是否有进程通过 lsof | grep "/dev/tty.usbserial-EN270425" 没有返回值。

我能够连接到另一台机器上的端口,唯一的区别是操作系统和 python 版本。 CAN 连接的机器运行 Mac OS Mojave 和 Python 3.6,不能连接的机器运行 Mac OS Catalina 和 Python 3.8。有谁知道我可以从这里继续前进吗?

【问题讨论】:

【参考方案1】:

我有同样的问题。问题不在于 python 或您的代码,而在于您的 USB 串行设备的驱动程序,因此请确保您安装了正确的驱动程序。

就我而言,它是一根 FTDI 串行电缆。我通过从here 安装官方 FTDI 驱动程序解决了这个问题。确保在询问时允许在系统偏好设置中访问。我还必须重新启动并断开/重新连接 USB 几次。

一旦驱动程序工作,与 OP 相同的代码应该可以工作

【讨论】:

【参考方案2】:

我也遇到了同样的问题,我还使用了 FTDI 电缆和 USB 加密狗。 就我而言,我将加密狗连接到 Mac(操作系统为 Catalina),并通过使用 Parallel Desktop 将其用于 Windows 操作系统。

但是,在断开它与 Windows 的连接并连接到 Mac 以使用 Pyserial 发送信号后,脚本留下了相同的错误消息。

当加密狗连接到 Windows 时,它在 Windows 软件中运行良好。

所以,这个问题可能不是来自驱动程序问题。


我可以用 AirPods 做同样的事情。 这是我在下面所做的。

ls -l /dev/tty.*

crw-rw-rw- 1 根轮 18, 0 Mar 6 19:11 /dev/tty.Bluetooth-Incoming-Port

crw-rw-rw- 1 根轮 18, 2 Mar 6 19:11 /dev/tty.adkslmAirPods-Wirelessi

% lsof  /dev/tty.adkslmAirPods-Wirelessi

命令 PID 用户 FD 类型设备大小/关闭节点名称

python3.7 4920 --- 89u CHR 18,2 0t0 641 /dev/tty.adkslmAirPods-Wirelessi

% 杀死 4920

从这里开始,Python 脚本

import serial ser = serial.Serial(port='/dev/tty.adkslmAirPods-Wirelessi')

这是我可以制作的错误消息。

Traceback(最近一次调用最后一次): 文件“/Users/---/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/serial/serialposix.py”,第 265 行,打开 self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) OSError:[Errno 16] 资源繁忙:'/dev/tty.adkslmAirPods-Wirelessi'。 在处理上述异常的过程中,又出现了一个异常:

Traceback(最近一次调用最后一次): 文件“/Users/---/Documents/GitHub/Script/Python/behavioral_analysis/test.py”,第 4 行,在 ser = serial.Serial(port='/dev/tty.adkslmAirPods-Wirelessi') init 中的文件“/Users/---/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/serial/serialutil.py”,第 240 行 self.open() 文件“/Users/---/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/serial/serialposix.py”,第 268 行,打开 raise SerialException(msg.errno, "无法打开端口 : ".format(self._port, msg)) serial.serialutil.SerialException:[Errno 16] 无法打开端口 /dev/tty.adkslmAirPods-Wirelessi:[Errno 16] 资源繁忙:'/dev/tty.adkslmAirPods-Wirelessi' `

【讨论】:

以上是关于PySerial 报告看似未使用的串行端口的“资源忙”的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 WinXP 上使用 pyserial 打开串行端口 - >“拒绝访问”

仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效

使用 pyserial 识别给定 USB VID 和 PID 的 USB 到串行端口

可以在网站上使用 pySerial 打开并将数据发送到本地计算机上的串行端口吗?

从 Mac 上运行的 pyserial 打开串行端口时禁用 DTR

Pyserial 不能很好地使用虚拟端口