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

sec*_*ica 4 python pyserial raspberry-pi raspbian

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

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

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

有没有更好的方法来强制 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)
Run Code Online (Sandbox Code Playgroud)

Pat*_*ead 5

您可以尝试创建一个udev规则,该规则将创建指向该 USB 设备的符号链接,然后您将能够使用/dev/myUSB 之类的内容,该规则对于该特定 USB 设备始终保持不变。

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

Bus 001 Device 004: ID 0403:6001 Future Technology Devices International
Run Code Online (Sandbox Code Playgroud)

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

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

sudo nano /etc/udev/rules.d/99_usbdevices.rules
Run Code Online (Sandbox Code Playgroud)

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

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

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="myUSB"
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以找到手册,例如,[此处](http://reactivated.net/writing_udev_rules.html) 或 [here](https://www.element14.com/community/community/design-challenges/sci- fi-your-pi/blog/2015/07/15/persistent-names-for-usb-devices) (2认同)