gpt4 book ai didi

python - 使用 pySerial 在 Python 下重新连接到 USB 端口时,如何避免在 ttyUSB0 和 ttyUSB1 之间切换?

转载 作者:行者123 更新时间:2023-11-28 22:21:24 25 4
gpt4 key购买 nike

我有一个串行 Python 程序,Linux 环境(Raspbian/Raspberry Pi),它通过 USB 转串行适配器使用串行端口。我需要处理用户拔下 USB 适配器然后重新插入的情况。

问题是,在重新连接时,ttyUSB0 变成了 ttyUSB1 因此不再找到该端口。但是,如果我停止 Python 程序(键盘中断)并再次拔下并重新插入 USB 适配器,则端口将返回到 ttyUSB0(这样我就可以重新开始)。这只有在 Python 程序停止时才会发生。

我在触发器模式下测试了该程序(它似乎可以正常工作)以便在不再找到 ttyUSB0 时使用 ttyUSB1 ,反之亦然,使用 ttyUSB0 以防 ttyUSB1 不再找到,等等,但这对我来说似乎是一个奇怪的解决方案。

有没有更好的方法来强制 pySerial “忘记”它曾经连接到 ttyUSB0 以防出现错误并在程序仍在运行时将当前端口释放到系统?

这是一个有效的触发器测试程序:

import serial
import time

p = "/dev/ttyUSB0"

while True:
error_flag = False
try:
s = serial.Serial(port=p, baudrate=9600, bytesize=8, parity="N", stopbits=1, timeout=None, xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, inter_byte_timeout=None)
except Exception as e:
error_flag = True
if "ttyUSB0" in str(e):
p = "/dev/ttyUSB1"
print ("port is now", p)
elif "ttyUSB1" in str(e):
p = "/dev/ttyUSB0"
print ("port is now", p)
else:
print (e) # none of the above

# if not error_flag, do whatever, etc.

time.sleep(1)

最佳答案

您可以尝试创建一个 udev将创建 symbolic link 的规则到那个 USB 设备,然后你就可以使用像 /dev/myUSB 这样的东西,它对于那个特定的 USB 设备总是保持不变。

首先,您需要找到 USB 驱动器的一些标识信息。输入 lsusb 应该会显示一些如下所示的信息:

Bus 001 Device 004: ID 0403:6001 Future Technology Devices International

在此示例中,0403 是供应商 ID,6001 是产品 ID

创建一个名为 99_usbdevice.rules 的文件(我认为名称不重要,重要的是目录):

sudo nano /etc/udev/rules.d/99_usbdevices.rules

请注意,上面的目录可能特定于 Raspbian。

将下面的行复制/粘贴到文件中并保存:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="myUSB"

重启 Raspberry Pi 或拔下 USB 并重新插入。现在应该有一个 /dev/myUSB 条目,您可以像使用 ttyUSB# 条目一样使用它。

关于python - 使用 pySerial 在 Python 下重新连接到 USB 端口时,如何避免在 ttyUSB0 和 ttyUSB1 之间切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48356223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com