2011-10-13 8 views
5

vorrei qualche indicazione su come farlo in python:pitone: come rilevare dispositivo di nome/id su una seriale COM

  • Identificare nel porto un nome specifico nella seriale COM (\ Device \ VCP0 e \ Device \ VCP1 questi sono ottenere navigando nella finestra di regedit)

  • e ottenere l'ID del dispositivo che è pluged

posso già identificare il COM avalable con questo codice pySerial ° a scansione il attiva porta seriale COM

import serial 

def scan(): 
    """scan for available ports. return a list of tuples (num, name)""" 
    available = [] 
    for i in range(256): 
     try: 
      s = serial.Serial(i) 
      available.append((i, s.portstr)) 
      s.close() # explicit close 'cause of delayed GC in java 
     except serial.SerialException: 
      pass 
    return available 

if __name__=='__main__': 
    print "Found ports:" 
    for n,s in scan(): 
     print "(%d) %s" % (n,s) 

Grazie in anticipo

+0

Cosa intendi con "ottenere l'id del dispositivo che è collegato"? Intendi qualche ID dispositivo fisico del dispositivo seriale? In tal caso, non esiste uno standard per gli ID dei dispositivi seriali, quindi dovrai leggere il manuale per il tuo dispositivo specifico. – Chriszuma

+0

Sì, intendo l'ID fisico del dispositivo. Il mio prpose è come posso richiedere una COM seriale per identificare il nome della divisa associato. Ad esempio, diciamo che ho già utilizzato 3 porte (COM1, COM2, COM3), quindi collego un dispositivo che ID dispositivo fisico è ID1. ID1 è collegato a una USB2serial, quindi posso vedere che ho 2 porte in più attivate nei registri Windows COM5 e COM6. Alla fine collego il mio cellulare a COM7. Quindi volevo essere in grado di identificare COM5 e COM6 tramite l'ID del dispositivo. –

risposta

4

Non sono sicuro di quale sistema operativo in uso, ma questo è in Win7-x64

import win32com.client 
wmi = win32com.client.GetObject("winmgmts:") 
for serial in wmi.InstancesOf("Win32_SerialPort"): 
     print (serial.Name, serial.Description) 

Utilizzando questa informazione, puoi analizzarla e ottenere i numeri COM. È possibile ottenere altri attributi delle istanze di serie qui: http://msdn.microsoft.com/en-us/library/aa394413(v=vs.85).aspx

+0

bello questo è molto più breve della ricetta che stavo usando ... qualcuno sa se funziona anche su Windows XP? –

+0

Credo che dovrebbe. Presumo che .net deve essere aggiornato in xp per funzionare. tuttavia, il supporto .net per xp potrebbe essersi fermato. – Ken

0

Due risposta

1) Poiché questo si basa su hardware a disposizione, è perfettamente possibile che il codice di prova ha lavorato nell'ambiente è stato scritto su , ma non funziona nel tuo ambiente - potrebbe essere abbastanza probabile se sei su Windows e questo è stato scritto su Linux. Il codice usa la porta 0 - non so come quella mappa a COM1 ecc.

2) Su Windows, le porte COM avevano nomi DOS come COM1, COM2 - cioè una stringa, non una int (non sono come i numeri di porta TCP/IP). Più di recente in Windows c'è il formato \. \ COMnotanumber che consente un nome più generico, ho visto questi utilizzati da un convertitore USB-seriale. Avendo dato una rapida occhiata al codice sorgente di SerialBase pyserial in serialutil.py, è un IMO un po 'strano, perché AFAICT self.name viene impostato solo quando si usa un'impostazione di porta esplicita chiamando self.port (portname). Si potrebbe voler provare a inizializzare l'istanza della porta seriale con serport = Serial (0), quindi chiamare esplicitamente serport.port ('COM1') (o qualunque sia il nome della porta invece di COM1).

Appena corretto il codice. funziona bene ... :)

import serial 

def scan(): 
    available = [] 
    for i in range(256): 
     try: 
      s = serial.Serial('COM'+str(i)) 
      available.append((s.portstr)) 
      s.close() # explicit close 'cause of delayed GC in java 
     except serial.SerialException: 
      pass 

    for s in available: 
     print "%s" % (s) 


if __name__=='__main__': 
    print "Found ports:" 
    scan()