Usb
如何使用“兄弟”設備的序列號(對於沒有唯一序列號的 USB 設備)制定 udev 規則?
我有由以下組成的測試設備:
- 一個連接到主 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 串列。