如何使用C查找Linux中连接到USB串行端口的设备?

如何使用C查找Linux中连接到USB串行端口的设备?,c,C,我们正在制作一个设备,它有8个串行端口。它运行在Monta Vista Pro5内核上。我们在C工作 假设:一个设备连接到ttyUSB0、ttyUSB1和ttyUSB2。下一个设备连接到ttyUSB3,另一个连接到ttyUSB4。我如何知道哪个设备连接到哪个端口??例如ttyUSB0或ttyUSB1等。有没有一种方法可以直接查询设备并找到它连接到哪个端口。或者,在C语言中,打开ttyUSB0,以某种方式查询它,并得到关于它是哪个设备的一些回复 一种相当复杂的方法:进行统计,比如说/dev/tty

我们正在制作一个设备,它有8个串行端口。它运行在Monta Vista Pro5内核上。我们在C工作

假设:一个设备连接到ttyUSB0、ttyUSB1和ttyUSB2。下一个设备连接到ttyUSB3,另一个连接到ttyUSB4。我如何知道哪个设备连接到哪个端口??例如ttyUSB0或ttyUSB1等。有没有一种方法可以直接查询设备并找到它连接到哪个端口。或者,在C语言中,打开ttyUSB0,以某种方式查询它,并得到关于它是哪个设备的一些回复

一种相当复杂的方法:进行统计,比如说/dev/ttyUSB0。获取设备编号。然后在/proc/bus/usb/devices中搜索该设备,并查找供应商id或用于标识该设备的内容

或:是否有办法在插入时为一个设备保留ttyUSB0、ttyUSB1和ttyUSB2,为另一个设备保留ttyUSB3,依此类推?这样我就知道哪个设备连接到哪个端口

请帮忙……:)

提前谢谢。
Nubin Stanley

实现这一点的最佳方法是使用,但如果这不能为您提供有关设备的足够信息(可能不是),那么您必须使用内核提供的
/proc
文件系统,特别是
/proc/bus/usb/


阅读
/proc/bus/usb
:尤其是
/proc/bus/usb/设备
。但正如你所说,这一切都有点骇人听闻

您可以使用udev规则创建仅指向设备的符号链接:

(这些规则位于/etc/udev/rules.d//-name.rules中——请查看您的udev文档

KERNEL=="ttyUSB*", ATTRS{idVendor}=="<vendorid>", MODE="0666", SYMLINK+="mydev"
KERNEL==“ttyUSB*”,ATTRS{idVendor}==”,MODE=“0666”,SYMLINK+=“mydev”
您必须为您的设备指定供应商id和/或产品id。在上面的示例中,这些设备将位于/dev/mydev


您还可以使用各种其他参数创建适当的唯一符号链接供您使用。请查看udev手册页。

此Python代码似乎可以找到给定供应商ID和产品ID的/dev/ttyUSB编号。将其转换为C并不难。解析
hwinfo--usb
的输出也可以完成此任务。regx是:

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

这是我的代码,基于Alex Robinson的,但没有全局“除外”:


让我看看我是否做对了。您要做的是将/dev/ttyUSBx节点与主机系统上的/proc/bus/usb设备相匹配?还是要识别连接到usb串行适配器的串行设备?stat'ing/dev/只会获取设备的主要版本和次要版本。这些设备无论如何都不会连接到供应商/产品/设备ID。因此,您的设备带有一些USB串行IC(例如来自FTDI)您需要识别它吗?您是否在USB串行芯片中设置了供应商/产品ID和序列号?您的建议将帮助我获得到设备的唯一链接。但这不是我想要的。已经连接了3个随机设备,它们占用了ttyUSB0、ttyUSB1和ttyUSB2。现在的问题是,我不知道连接到哪个设备哪个端口。我需要一种方法来找出哪个设备连接到ttyUSB0或ttyUSB1或ttyUSB2:)我已经回答了你的问题-“有没有办法为一个设备保留ttyUSB0、ttyUSB1和ttyUSB2,为另一个设备保留ttyUSB3…”。如果要保留某个设备的设备条目,则需要了解该设备的详细信息。当然,如果它们是随机设备,这也没用。而且,/etc/udev/rules.d/“中没有“-name.rules”文件。那么我应该做一个吗??“name.rules”前面有一个“-”,对吗??)很高兴它对你有用。另外,我实际上已经输入了/etc/udev/rules.d/(number)-(yourname).rules,但是输入了“”,所以它变成了一个标记,没有显示出来。对于用户定义的规则,这个数字最好在50左右。我目前正在研究libusb。但话说回来,我不知道它是否会给我任何关于设备连接到哪个端口的指示。。。。。。假设我使用libusb查询我的设备,我需要找出/dev/ttyUSB中的“x”,这样我就可以知道特定的设备是/dev/ttyUSB0或ttyUSB1等等:)
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()
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)