【问题标题】:Identify which USB device is /dev/ttyUSB0识别哪个 USB 设备是 /dev/ttyUSB0
【发布时间】:2020-07-16 22:09:33
【问题描述】:

我正在使用 Linux 发行版 (Raspbian),并且我有两个 USB 串行适配器连接到微控制器。每当我连接两个适配器时,都会出现串行端口“/dev/ttyUSB0”和“/dev/ttyUSB1”;这里的“/dev/ttyUSB0”是最先物理连接的适配器(系统首先识别)。

现在,我正在寻找一种方法来确定在微控制器重新启动时哪个适配器是哪个适配器。即,两个适配器都插在它们的 USB 端口中,我无法物理拔出/重新插入以强制哪个适配器是“USB0”。

基础研究让我想到了这些命令(图片供参考):

ls /dev/ttyUSB* 列出活动的 USB 串行端口。

lsusb 获取有关 USB 总线和连接设备的更多信息。

有没有办法将这两个结果(或替代方法)联系起来以找出我需要什么?例如,在上面的图片中“/dev/ttyUSB0”是“Bus 001 Device 008: ID 1a86:...”,但是我怎样才能通过软件找到它(最好使用 Python,但 shell 脚本也可以) ?

【问题讨论】:

  • 两条信息都由 udev 传递给热插拔脚本。因此,您可以阅读 udev(特别是“coldplug”部分)源代码,了解它是如何将它们配对的。
  • 要查看运行中的代码,请尝试 udevinfo -a -n /dev/ttyUSB0udevadm info --a --name /dev/ttyUSB0
  • 这能回答你的问题吗? Associate physical usb port to device
  • @BenVoigt Loos 好像 udevinfo 命令已更新为 udevadm info。这看起来很有希望;你知道python中是否有等价的东西。如果没有,我想我会尝试使用 python 的 subprocess 模块从我的应用程序中运行该 bash 命令。
  • @DanMicroS:我搜索了“udevadm python”,发现:pyudev.readthedocs.io/en/latest

标签: linux raspberry-pi serial-port usbserial


【解决方案1】:

由于您提到您想从 Python 中执行此操作,pyudev 具有以下示例代码来访问 udev 所知道的关于设备文件标识的设备的所有内容:

from pyudev import Context, Device
context = Context()
device = Devices.from_device_file(context, '/dev/sda')

我相信 /dev/ttyUSB0 应该也能很好地工作。

https://pyudev.readthedocs.io/en/latest/api/pyudev.html#pyudev.Devices.from_device_file

在 Python 中拥有设备 udev 实例后,您可以访问 device.attributesdevice.properties 以获取丰富的信息,包括 VID、PID、字符串描述符等。文档说

所有知名的字典方法和运算符(例如.keys().items()in)都可用于访问设备属性。

【讨论】:

  • 我实际上是使用子进程并以这种方式调用 bash 命令让它工作的。但是,是的,我认为使用这个指定的 python 库是更好的选择,以防我需要更多信息的未来改进/修改。谢谢!
  • 使用 pyudev 版本 0.22.0 您将收到以下错误:未定义“设备”。您可以将上面的脚本替换为 - '''' import pyudev context = pyudev.Context() device = pyudev.Devices.from_device_file(context, '/dev/ttyUSB0') '''' 它适用于我:)
  • 只要在Device末尾加一个s也可以:from pyudev import Context, Devices
猜你喜欢
  • 2011-01-30
  • 2011-11-05
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多