Как получить адрес USB-to-serial?

ПРОБЛЕМА

Pyserial: последовательное USB-устройство имеет разные адреса в зависимости от того, устанавливаю ли я его на настольный компьютер (Catalina) или ноутбук (High Sierra):

ser = serial.Serial('/dev/cu.usbserial', 9600) #OSX High-Sierra
ser = serial.Serial('/dev/cu.usbserial-1D120', 9600) #OSX Catalina

Есть ли способ использовать подстановочный знак? /dev/su.usbseria*. Цель — одна строка кода, которая будет обрабатывать любой случай.

Приветствуется любое понимание того, почему было добавлено -1D120.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

Пример

import serial.tools.list_ports
#Find USB Port
def find_port():  #Finds which port the arduino is plugged into
    ports = list(serial.tools.list_ports.comports())
    for p in ports:
        if '0403' in p[2]: #unique to Osepp Uno (arduino clone)                
            return p[0]

Предположим, что целевая строка (регулярное выражение) имеет формат:

/dev/cu.usbserial**************

Как можно изменить приведенный выше фрагмент кода, чтобы перехватывать и возвращать последовательное USB-устройство?


person gatorback    schedule 14.08.2020    source источник
comment
Переберите доступные порты (см. этот ответ) и выберите тот, который вы хотите использовать.   -  person zrzka    schedule 17.08.2020
comment
@zrzka Спасибо за ссылку. Решение опубликовано   -  person gatorback    schedule 18.08.2020


Ответы (1)


Примечание. Этот ответ был вырезан из вопроса и правильно размещен здесь.

Получить адрес USB-to-serial и открыть порт

YMMV: учитывайте ограничения алгоритма. Особенно строка перехвата: если найдено (перехвачено) более одного экземпляра, будет возвращен последний перехваченный элемент списка => он может быть или не быть предполагаемой целевой строкой.

import serial.tools.list_ports    
ports = list(serial.tools.list_ports.comports())
for p in ports: 
    #print(p[0])  #p[0] => target string
    if 'usbserial' in p[0]: #OSX: Trap usbserial device  /dev/cu.usbserial-1D120              
        serAddr=p[0]
    if 'ttyUSB' in p[0]: #Ubuntu :Trap usbserial device  /dev/ttyUSB0
        serAddr=p[0]              

ser = serial.Serial(serAddr, 9600) # Open port at 9600 baud

Можно добавить третью непроверенную ловушку для проверки COM-портов Windows:

import serial.tools.list_ports    
ports = list(serial.tools.list_ports.comports())
for p in ports: 
    #print(p[0])  #p[0] => target string
    if 'usbserial' in p[0]: #OSX: Trap usbserial device  /dev/cu.usbserial-1D120              
        serAddr=p[0]
    if 'ttyUSB' in p[0]: #Ubuntu :Trap usbserial device  /dev/ttyUSB0
        serAddr=p[0]              
    if 'COM' in p[0]: #Windows :Trap usbserial device  COM3 COM7 etc.
        serAddr=p[0]  
person Rob    schedule 23.03.2021