* 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ポートを抜き出すのが確実。
参考文献:
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)
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)