Как узнать, какое устройство подключено к USB-последовательному порту в Linux с помощью C? - PullRequest
9 голосов
/ 16 ноября 2010

Мы делаем устройство с 8 последовательными портами.Он работает на ядре Monta Vista Pro5.И мы работаем в C.

Предположим: Устройство подключается к ttyUSB0, ttyUSB1 и ttyUSB2.Следующее устройство подключается к ttyUSB3, а другое к ttyUSB4.Как я могу узнать, какое устройство подключено к какому порту?т.е. ttyUSB0 или ttyUSB1 или так далее.Есть ли способ напрямую запросить устройство и узнать, к какому порту оно подключено.Или, в C, откройте ttyUSB0, запросите его как-нибудь и получите ответ о том, какое это устройство ??

Довольно сложный способ: сделать статистику, скажем, / dev / ttyUSB0,Получить номер устройства.И найдите это в / proc / bus / usb / devices и найдите идентификатор поставщика или что-то, что идентифицирует устройство.

Или: Есть ли способ зарезервировать ttyUSB0, ttyUSB1 и ttyUSB2для одного устройства, ttyUSB3 для другого и так далее, когда они подключены?Таким образом, я буду знать, какое устройство подключено к какому порту.

Помогите пожалуйста .....:)

Заранее спасибо.Нубин Стэнли

Ответы [ 4 ]

9 голосов
/ 16 ноября 2010

Вы можете использовать правила udev для создания символических ссылок только на ваше устройство:

(эти правила находятся в /etc/udev/rules.d/-name.rules - посмотрите документацию по udev

KERNEL=="ttyUSB*", ATTRS{idVendor}=="<vendorid>", MODE="0666", SYMLINK+="mydev"

Вы должны указать свой идентификатор поставщика и / или идентификатор продукта для вашего устройства. Тогда эти устройства будут доступны в / dev / mydev в приведенном выше примере.

Вы также можете использовать различные другие параметры для создания соответствующих уникальных символических ссылок для вашего использования. Проверьте страницу руководства udev.

3 голосов
/ 05 апреля 2012

Вот мой код, основанный на коде Алекса Робинсона, но без глобального «кроме»:

import os
from os.path import join

def find_tty_usb(idVendor, idProduct):
    """find_tty_usb('067b', '2302') -> '/dev/ttyUSB0'"""
    # Note: if searching for a lot of pairs, it would be much faster to search
    # for the enitre lot at once instead of going over all the usb devices
    # each time.
    for dnbase in os.listdir('/sys/bus/usb/devices'):
        dn = join('/sys/bus/usb/devices', dnbase)
        if not os.path.exists(join(dn, 'idVendor')):
            continue
        idv = open(join(dn, 'idVendor')).read().strip()
        if idv != idVendor:
            continue
        idp = open(join(dn, 'idProduct')).read().strip()
        if idp != idProduct:
            continue
        for subdir in os.listdir(dn):
            if subdir.startswith(dnbase+':'):
                for subsubdir in os.listdir(join(dn, subdir)):
                    if subsubdir.startswith('ttyUSB'):
                        return join('/dev', subsubdir)
1 голос
/ 09 ноября 2011

Этот код Python, кажется, находит номер / dev / ttyUSB для данного идентификатора поставщика и идентификатора продукта.Нетрудно перевести его на C. Анализ выходных данных из hwinfo --usb тоже может помочь.Регкс:

"\s\sVendor:\susb\s0x([0-9a-f]{4}).*?\s\sDevice:\susb\s0x([0-9a-f]{4}).*?\s\sDevice\sFile:\s/dev/ttyUSB([0-9]+)"
import  glob
import  os
import  re

def find_usb_tty(vendor_id = None, product_id = None) :
    tty_devs    = []

    for dn in glob.glob('/sys/bus/usb/devices/*') :
        try     :
            vid = int(open(os.path.join(dn, "idVendor" )).read().strip(), 16)
            pid = int(open(os.path.join(dn, "idProduct")).read().strip(), 16)
            if  ((vendor_id is None) or (vid == vendor_id)) and ((product_id is None) or (pid == product_id)) :
                dns = glob.glob(os.path.join(dn, os.path.basename(dn) + "*"))
                for sdn in dns :
                    for fn in glob.glob(os.path.join(sdn, "*")) :
                        if  re.search(r"\/ttyUSB[0-9]+$", fn) :
                            #tty_devs.append("/dev" + os.path.basename(fn))
                            tty_devs.append(os.path.join("/dev", os.path.basename(fn)))
                        pass
                    pass
                pass
            pass
        except ( ValueError, TypeError, AttributeError, OSError, IOError ) :
            pass
        pass

    return tty_devs

print find_usb_tty()
0 голосов
/ 16 ноября 2010

Лучший способ сделать это - использовать libusb, но если это не дает вам достаточной информации о ваших устройствах (чего может и не быть), вам придетсяиспользуйте файловую систему /proc, которую предоставляет ядро, в частности /proc/bus/usb/.

Прочитайте эту информацию на /proc/bus/usb: в частности на /proc/bus/usb/devices.Но, как вы говорите, все это немного глупо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...