2011-10-13 38 views
5

Tôi muốn một số dấu hiệu về cách để làm điều này trong python:python: Làm thế nào để phát hiện thiết bị tên/id trên COM nối tiếp

  • Xác định các cổng được đặt tên một tên cụ thể trong com nối tiếp (\ Device \ VCP0 và \ Device \ VCP1 đây là có được bằng cách duyệt trong cửa sổ regedit)

  • và nhận được id của thiết bị được pluged

tôi đã có thể xác định các COM avalable với mã pySerial này thứ tại quét lên các hoạt động nối tiếp cổng 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) 

Cảm ơn trước

+0

Ý của bạn là "lấy id của thiết bị được cắm"? Bạn có nghĩa là một số ID thiết bị vật lý của thiết bị nối tiếp? Nếu vậy, không có tiêu chuẩn cho ID thiết bị nối tiếp, vì vậy bạn sẽ phải đọc hướng dẫn sử dụng cho thiết bị cụ thể của bạn. – Chriszuma

+0

Có nghĩa là ID vật lý của thiết bị. Prupose của tôi là làm thế nào tôi có thể nhắc một COM nối tiếp để xác định tên của divice liên quan. Ví dụ, giả sử tôi có 3 cổng đã được sử dụng (COM1, COM2, COM3) sau đó tôi cắm một thiết bị mà id thiết bị vật lý là ID1. ID1 được cắm bởi một USB2serial, vì vậy tôi có thể thấy rằng tôi có thêm 2 cổng kích hoạt trong cửa sổ đăng ký COM5 và COM6. Cuối cùng tôi cắm điện thoại di động của tôi để COM7. Vì vậy, tôi muốn có thể xác định COM5 và COM6 bằng ID thiết bị. –

Trả lời

4

Tôi không chắc chắn những gì hệ điều hành bạn đang sử dụng, nhưng điều này là trong Win7-x64

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

Sử dụng thông tin này, bạn có thể phân tích nó và nhận được số COM. Bạn có thể nhận được các thuộc tính khác của các trường hợp nối tiếp ở đây: http://msdn.microsoft.com/en-us/library/aa394413(v=vs.85).aspx

+0

cái này ngắn hơn nhiều so với công thức mà tôi đang sử dụng ... có ai biết nếu điều này làm việc trên windows xp không? –

+0

Tôi tin là cần. Tôi giả sử .net cần phải được cập nhật trong xp để làm việc. tuy nhiên, hỗ trợ .net cho xp có thể đã dừng lại. – Ken

0

Hai câu trả lời

1) Bởi vì đây dựa trên phần cứng có sẵn, nó là hoàn toàn có thể là mã kiểm tra làm việc trong môi trường nó được viết trên , nhưng không hoạt động trong môi trường của bạn - có thể khá có khả năng nếu bạn đang sử dụng Windows và điều này được viết trên Linux. Mã sử ​​dụng cổng 0 - không biết cách ánh xạ tới COM1, v.v.

2) Trên Windows, cổng COM được sử dụng để có các tên DOS như COM1, COM2 - tức là Một chuỗi, không phải là int (chúng không phải là giống như số cổng TCP/IP). Gần đây hơn trong Windows có định dạng \. \ COMnotanumber cho phép một tên chung chung hơn, tôi đã nhìn thấy chúng được sử dụng bởi một USB để chuyển đổi nối tiếp. Có một cái nhìn nhanh về mã nguồn của SerialBase pyserial trong serialutil.py, nó là một IMO lẻ, vì AFAICT self.name chỉ được thiết lập khi bạn sử dụng một thiết lập cổng rõ ràng bằng cách gọi self.port (portname). Bạn có thể muốn thử intializing các trường hợp cổng nối tiếp với serport = Serial (0) sau đó gọi một cách rõ ràng serport.port ('COM1') (hoặc bất kỳ tên cổng của bạn là thay vì COM1).

Chỉ cần sửa mã. làm việc tốt ... :)

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() 
Các vấn đề liên quan