2011-10-13 17 views
5

me gustaría alguna indicación sobre cómo hacer esto en Python:pitón: Cómo detectar el nombre del dispositivo/ID en una serie COM

  • Identificar el puerto un nombre específico en la serie COM (\ Device \ VCP0 y \ Device \ VCp1 estos son llegar navegando en la ventana de regedit)

  • y obtener el identificador del dispositivo que se pluged

ya puede identificar el COM avalable con este código PySerial º al escanear el COM puerto serie activa

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) 

Gracias de antemano

+0

¿Qué quiere decir "obtener la identificación del dispositivo que está pluged"? ¿Te refieres a alguna identificación de dispositivo físico del dispositivo serie? Si es así, no hay un estándar para ID de dispositivo en serie, por lo que deberá leer el manual de su dispositivo específico. – Chriszuma

+0

Sí, me refiero a la identificación física del dispositivo. Mi prupose es cómo puedo solicitar un COM serial para identificar el nombre del divice asociado. Por ejemplo, supongamos que tengo 3 puertos ya utilizados (COM1, COM2, COM3) y luego conecto un dispositivo cuyo ID de dispositivo físico es ID1. ID1 está conectado por un USB2serial, por lo que puedo ver que tengo 2 puertos más activados en los registros de Windows COM5 y COM6. Finalmente conecto mi teléfono celular a COM7. Así que quería poder identificar COM5 y COM6 mediante la identificación del dispositivo. –

Respuesta

4

No estoy seguro de qué sistema operativo que esté utilizando, pero esto es en Win7 x64

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

Uso esta información, puede analizarla y obtener los números COM. Puede obtener otros atributos de las instancias de serie aquí: http://msdn.microsoft.com/en-us/library/aa394413(v=vs.85).aspx

+0

bueno, esto es mucho más corto que la receta que estaba usando ... ¿Alguien sabe si esto también funciona en Windows XP? –

+0

Creo que debería. Supongo que .net necesita estar actualizado en xp para trabajar. sin embargo, el soporte de .net para xp podría haberse detenido. – Ken

0

Dos respuesta

1) Debido a que este se basa en el hardware disponible, es perfectamente posible que el código de prueba trabajó en el entorno en el que fue escrito en , pero no funciona en su entorno; puede ser bastante probable si está en Windows y está escrito en Linux. El código usa el puerto 0 - no sé cómo se correlaciona con COM1, etc.

2) En Windows, los puertos COM solían tener nombres de DOS como COM1, COM2 - es decir, una cadena, no una int (no son como los números de puerto TCP/IP). Más recientemente en Windows existe el formato \. \ COMnotanumber que permite un nombre más genérico, he visto que estos son utilizados por un convertidor de USB a serie. Tras echar un rápido vistazo al código fuente de SerialBase pyserial en serialutil.py, es un OMI un tanto extraño, porque el nombre propio de AFAICT solo se establece cuando se usa una configuración de puerto explícita llamando a self.port (portname). Es posible que desee intentar inicializar la instancia del puerto serie con serport = Serial (0) y luego llamar explícitamente a serport.port ('COM1') (o cualquiera que sea el nombre de su puerto en lugar de COM1).

Solo corrigió el código. funciona bien ... :)

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() 
Cuestiones relacionadas