2010-11-16 33 views
9

Stiamo creando un dispositivo e dispone di 8 porte seriali. Funziona con il kernel Monta Vista Pro5. E stiamo lavorando in C.Come trovare quale dispositivo è collegato a una porta seriale USB in Linux usando C?

Supponiamo: Un dispositivo viene collegato a ttyUSB0, ttyUSB1 e ttyUSB2. Il dispositivo successivo viene connesso a ttyUSB3 e un altro a ttyUSB4. Come posso sapere quale dispositivo viene collegato a quale porta ?? cioè ttyUSB0 o ttyUSB1 o così via. C'è un modo per interrogare direttamente il dispositivo e trovare a quale porta è collegato. Oppure, in C, apri ttyUSB0, interrogalo in qualche modo e ottieni una risposta su quale dispositivo è ??

Un modo piuttosto complicato: fare una statistica, ad esempio/dev/ttyUSB0. Ottieni il numero del dispositivo. E cercare questo in/proc/bus/usb/dispositivi e trovare l'id del venditore o qualcosa per identificare il dispositivo.

Oppure: C'è un modo per prenotare ttyUSB0, ttyUSB1 e ttyUSB2 per un dispositivo, ttyUSB3 per un altro e così via quando sono collegati? In questo modo saprò quale dispositivo è connesso a quale porta.

Aiuto per favore ..... :)

Grazie in anticipo. Nubin Stanley

+0

Fammi vedere se ho ottenuto questo diritto. Quello che stai cercando di fare è abbinare i nodi/dev/ttyUSBx al dispositivo/proc/bus/usb sul sistema host? O stai cercando di identificare un dispositivo seriale collegato a un adattatore USB? – thkala

+0

stat'ing/dev/ otterrà solo le versioni principali e secondarie del dispositivo.Questi non sono in alcun modo collegati a ID fornitore/prodotto/dispositivo. – thkala

+0

Quindi hai un dispositivo con qualche IC usbserial (ad esempio da FTDI) e devi identificarlo? Avete impostato ID fornitore/prodotto e numero di serie nel chip usbserial? – thkala

risposta

0

Il modo migliore per farlo è quello sarebbe quella di utilizzare libusb, ma se questo non ti dà abbastanza informazioni sulle periferiche (che potrebbe non), quindi dovrete usare il filesystem /proc che il kernel rende disponibile, in particolare /proc/bus/usb/.

Leggere una riga di this information su /proc/bus/usb: in particolare su /proc/bus/usb/devices. Ma come dici tu, questo è tutto un po 'hacky!

+0

Attualmente sto lavorando su libusb. Ma poi di nuovo, non so se mi darebbe qualche indicazione su quale porta è collegato un dispositivo a ...... Supponiamo di interrogare il mio dispositivo usando libusb, ho bisogno di trovare in qualche modo 'x' in/dev/ttyUSB in modo che possa sapere che il dispositivo particolare è/dev/ttyUSB0 o ttyUSB1 o così via :) – stanzlavos

9

È possibile utilizzare le regole di udev per creare link simbolici solo per il dispositivo:

(queste regole vanno in /etc/udev/rules.d/-name.rules - guardare la documentazione di udev

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

Devi specificare l'ID fornitore e/o del prodotto ID per il vostro dispositivo. Poi questi dispositivi saranno disponibili in/dev/MyDev nell'esempio di cui sopra.

È inoltre possibile utilizzare vari altri parametri per creare appropriata link simbolici unici per il tuo uso. Controlla la pagina man di udev.

+0

Ciò che mi hai suggerito mi avrebbe aiutato ad ottenere un collegamento univoco al mio dispositivo. Ma non è quello che voglio. – stanzlavos

+0

Sono stati collegati 3 dispositivi casuali e si sono verificati ttyUSB0, ttyUSB1 e ttyUSB2. Ora il problema è che non so quali dispositivi sono connessi a quale porta. Ho bisogno di un modo per scoprire quale dispositivo è connesso a ttyUSB0 o ttyUSB1 o ttyUSB2 :) – stanzlavos

+0

Ho risposto alla tua domanda: "C'è un modo per prenotare ttyUSB0, ttyUSB1 e ttyUSB2 per un dispositivo, ttyUSB3 per un altro ... ". Se si desidera prenotare le voci del dispositivo su un dispositivo, è necessario conoscere i dettagli di quel dispositivo. Ovviamente, se sono dispositivi casuali, questo non aiuta. – rsmoorthy

1

Questo codice Python sembra trovare il numero/dev/ttyUSB per l'ID fornitore e l'ID prodotto forniti. Non è difficile da tradurre in C. Anche l'analisi da hwinfo --usb può fare il trucco. Il 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]+)" 
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() 
3

Ecco il mio codice, sulla base di Alex Robinson, ma senza globale "eccezione":

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) 
Problemi correlati