Usb

如何使用“兄弟”設備的序列號(對於沒有唯一序列號的 USB 設備)制定 udev 規則?

  • July 8, 2016

我有由以下組成的測試設備:

  • 一個連接到主 PC 的 USB 集線器,該集線器嵌入在測試夾具中並被使用,因此我們只有 1 根 USB 電纜從夾具連接到 PC。
  • 一個 Arduino UNO,通過 USB 連接到集線器
  • 通過 USB 連接到 USB 集線器的測量儀器(功率計)
  • 另一個通過 USB 連接到 USB 集線器的測量設備(溫度計)
  • 一個 Python 腳本,從主 PC 執行測試程序並與 Arduino 和兩台儀器通信。

這一切都適用於我的第一個夾具,但我現在需要複製測試設置(一台 PC 上的 3 個測試夾具)。我想為udev設備分配持久性規則,以便測試人員稍後只需要根據他們使用的夾具選擇 1、2 或 3,因此他們不需要擺弄埠號。

有沒有辦法做一個基本上會說的規則: assign symlink /dev/powermeter01 to the powermeter that is on the same USB hub as the Arduino with the serial xxxxxxx

對於 Arduino,這很容易,因為資訊中有正確的序列號udevadm,但對於功率計,序列號始終相同,而對於溫度計,根本沒有序列號(感謝廉價供應商!!!)。

USB集線器顯然也沒有串列。

好吧,這不是問題的答案,而是給我帶來了解決方案。所以就在這裡。

我對 Udev 規則做了很多修改,沒有比我的 Arduino 持續出現更好的東西了/dev/arduino01(將使用/dev/arduino02, /dev/arduino03,… 用於其他夾具)

我的測試腳本是用 Python 編寫的,我剛剛發現有一個很好的庫,叫做pyudev,所以我決定看看這條路線。

幾分鐘後,我結束了

from pyudev import *
context = Context()
Arduino = Device.from_device_file(context, '/dev/arduino01') 
Hub = Arduino.find_parent("usb","usb_device").find_parent("usb") #first find_parent brings me up to the USB device Arduino, another find_parent brings me to the Hub

Fixture = Enumerator(context)
for dev in Fixture.match_parent(Hub).match_subsystem('tty'):
   if (dev.get('ID_VENDOR_ID')=="10c4" and dev.get('ID_MODEL_ID')=="ea60"): #I got those ID through udevadm.
       powermeter=dev
   if (dev.get('ID_VENDOR_ID')=="067b" and dev.get('ID_MODEL_ID')=="2303"): #I got those ID through udevadm.
       temprecorder=dev

print('Arduino in on ' + str(Arduino.device_node)) #prints : Arduino is on /dev/ttyACM0
print('Powermeter in on ' + str(powermeter.device_node)) #prints : Powermeter is on /dev/ttyUSB1
print('Thermometer in on ' + str(temprecorder.device_node)) #prints : Thermometer is on /dev/ttyUSB0

這給了我測試夾具的 3 個設備的 USB 埠,我現在可以將它提供給我的測試常式腳本。

我們之間更精明的人會看到我的溫度記錄器是通過 pl2303 USB 串列和我的功率計通過 CP2102 USB 串列。

引用自:https://unix.stackexchange.com/questions/292570