自分自身のための ものづくり / 自分自身のためのものづくりメモ

* Windows環境にて、USB接続COMポートを、個体識別する

#メモ #プログラミング #シリアルポート #Ruby
 Windows環境(少なくともWindows XP)では、USB接続のRS-232C(正確にはEIA-574)アダプタのCOMポート番号は、差すUSBポートを変えるとコロコロ変わる。COM19になったりCOM6になったり…。とても困る。
 一方、USB接続のその手の機器は、デバイスマネージャ上で個体識別できる。ならば当然、自作プログラムでも個体識別し、COMポート番号を自動設定できる。
 WMIを介して情報を得る。Win32_SerialPortではUSB接続の情報が得られない(場合が多い?)ので、Win32_PnPEntity からCOMポートを抜き出すのが確実。

require 'win32ole'

def ports
    locator = WIN32OLE.new("WbemScripting.SWbemLocator")
    services = locator.ConnectServer(".","root/cimv2")
    ports = services.ExecQuery "Select * From Win32_SerialPort"
    ports.each do |port|
        p port.Caption
        p port.Description
        print "\n"
    end
end

def ports_pnp
    ps = []
    locator = WIN32OLE.new("WbemScripting.SWbemLocator")
    services = locator.ConnectServer(".","root/cimv2")
    ports = services.ExecQuery "Select * From Win32_PnPEntity"
    ports.each do |port|
        if /\(COM\d+\)$/ =~ port.Caption
            p port.Caption
            p port.Description
            p port.Manufacturer
            print "\n"
        end
    end
end
   


print "Select * From Win32_SerialPort\n"
ports

print "Select * From Win32_PnPEntity\n"
ports_pnp

ruby -Ks comports.rb

Select * From Win32_SerialPort
"通信ポート (COM1)"
"通信ポート"

"通信ポート (COM2)"
"通信ポート"

Select * From Win32_PnPEntity
"Prolific USB-to-Serial Comm Port (COM19)"
"Prolific USB-to-Serial Comm Port"
"Prolific"

"USB-to-Serial Comm. Port (COM6)"
"USB-to-Serial Comm. Port"
"Aten"

"通信ポート (COM1)"
"通信ポート"
"(標準ポート)"

"通信ポート (COM2)"
"通信ポート"
"(標準ポート)"


参考文献:

Kick4 BBS
USBシリアルのポート名を知る方法?
http://www.kick4.net/bbs/c-board.cgi?cmd=ntr;tree=4;id=

Win32_SerialPort Class (Windows)
http://msdn.microsoft.com/en-us/library/aa394413(VS.85).aspx
Win32_PnPDevice Class (Windows)
http://msdn.microsoft.com/en-us/library/aa394352(VS.85).aspx

create : 2009/08/25 (Tue)
update : 2009/08/25 (Tue)