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)
您可以尝试创建一个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#条目一样使用它。
| 归档时间: |
|
| 查看次数: |
3756 次 |
| 最近记录: |