2011-10-13 28 views
5

chciałbym pewne wskazówki, w jaki sposób zrobić to w Pythonie:Python: Jak wykryć nazwa urządzenia/ID na szeregowego COM

  • zidentyfikować port o nazwie określonej nazwy w szeregowym COM (\ Device \ VCP0 i \ Device \ VCP1 to uzyskać poprzez przeglądanie w oknie regedit)

  • i uzyskać identyfikator urządzenia, który jest pluged

mogę już zidentyfikować avalable COM z tym kodem pyserial th na skanowanie aktywnego portu szeregowego 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) 

z góry dzięki

+0

Co masz na myśli, mówiąc: "uzyskać identyfikator urządzenia, które jest pluged"? Czy masz na myśli jakiś fizyczny identyfikator urządzenia szeregowego? Jeśli tak, nie ma standardu dla identyfikatorów urządzeń szeregowych, więc będziesz musiał przeczytać instrukcję dla swojego urządzenia. – Chriszuma

+0

Tak, mam na myśli fizyczny identyfikator urządzenia. Moja próba to, w jaki sposób mogę poprosić serial COM o identyfikację powiązanej nazwy banku. Przykładowo załóżmy, że mam już 3 porty już używane (COM1, COM2, COM3), a następnie podłączam urządzenie, którego identyfikator urządzenia fizycznego to ID1. ID1 jest podłączony przez USB2serial, więc widzę, że mam 2 więcej portów aktywowanych w rejestrach Windows COM5 i COM6. Na koniec podłączam telefon do COM7. Chciałem więc móc zidentyfikować COM5 i COM6 za pomocą identyfikatora urządzenia. –

Odpowiedz

4

Nie jestem pewien, co system operacyjny, którego używasz, ale to jest w Win7-x64

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

Używanie informacje te można przeanalizować i uzyskać numery COM. Można uzyskać inne atrybuty szeregowego przypadkach tutaj: http://msdn.microsoft.com/en-us/library/aa394413(v=vs.85).aspx

+0

miło, że jest o wiele krótszy niż przepis, którego używałem ... czy ktoś wie, czy to działa również na Windows XP? –

+0

Uważam, że powinno. Zakładam, że .net musi być na bieżąco w XP do pracy. jednak obsługa .net dla XP może zostać zatrzymana. – Ken

0

dwiema odpowiedziami

1), ponieważ opiera się na sprzęcie dostępne, to całkiem możliwe, że kod testu pracował w środowisku, że został napisany na , ale nie działa w twoim środowisku - może być całkiem prawdopodobne, jeśli jesteś w systemie Windows i został napisany na Linuksie. Kod używa portu 0 - nie wiem jak to mapuje do COM1 itp.

2) W systemie Windows porty COM używały nazw DOS, takich jak COM1, COM2 - tj. Ciąg znaków, a nie int (nie są to jak numery portów TCP/IP). Ostatnio w Windows istnieje format \. \ COMnotanumber, który pozwala na bardziej ogólną nazwę, widziałem te używane przez USB na szeregowy konwerter. Po krótkim sprawdzeniu kodu źródłowego pyserial SerialBase w serialutil.py, jest to trochę dziwne IMO, ponieważ AFAICT self.name jest ustawiany tylko wtedy, gdy używasz jawnego ustawienia portu, wywołując self.port (portname). Możesz spróbować zainicjować instancję portu szeregowego za pomocą serport = Serial (0), a następnie jawnie wywoływać port serport.port ("COM1") (lub jakakolwiek jest twoja nazwa portu zamiast COM1).

Właśnie poprawiono kod. działa dobrze ... :)

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() 
Powiązane problemy