VB2005のプログラムを作ろうと思い、
以前から作ろうと思っていたCOMポート名抜き出しを作ろうと思いました。
過去ログを見てUSB変換されたCOMポート抜き出しをWMIを使用して
やる物があったため、それをそのまま使おうと思いました。
で、フォームにテキストボックスを貼り、ボタンをクリックすると
下のプログラムが走るようにしました。
===ここから===
Dim swServices As WbemScripting.SWbemServices
Dim swObjectSet As WbemScripting.SWbemObjectSet
Dim swObject As WbemScripting.SWbemObject
Dim swProperty As WbemScripting.SWbemProperty
' 初回表示
txtOutput.AppendText("このPCからは以下のポートが検出されました。" & vbNewLine)
swServices = GetObject("winmgmts:{impersonationLevel=impersonate}")
swObjectSet = swServices.ExecQuery("select * from Win32_SerialPort")
'swObjectSet = swServices.ExecQuery("select * from Win32_Printer")
For Each swObject In swObjectSet
’抜き出し&記述ルーチン
Next
’各種後処理
===ここまで===
かなりはしょってますがこんな感じのどこにでもあると思うWMIの抜き出しです。
で、コメントアウトしてあるプリンターは取出できますが、
シリアルポートが抜き出せません。
実際はCOM5がUSB変換されているシリアルでして、本当はそのドライバ名を
抜き出したいのですが、それ以前にシリアルポートのデータをとれないという状況です。
プログラム自体は先ほども言いましたが、SQLの中をWin32_Printer等にすると
ちゃんと取得できますが、Win32_SerialPortにすると何も入ってきません・・
ちなみに正式にはRS232Cではなく、RS422と言う、シーケンサなどと接続する
USBシリアル変換のケーブルです。
デバイスマネージャー上では「ポート」の部分に
「DTC DIFC-U4 USB Serial Ports(COM5)」と表示されています。
現場でポートを指定するときにデバイスマネージャーをいちいち開くのが
面倒なため、ボタン一発でみれる物を!と思いまして作り始めました。
書いているうちにVBのプログラム自体とはちょっと関係ない気がしてきましたが、
なにかヒントはありませんでしょうか・・・
レスがついてないので、苦手なのですが回答しておきます。
.NETになってからCOMポート自体いじっていませんが、
WMIみたいなのではなく、
COMコントロール(Mscomm)を使って、
ATコマンド送ってやれば取れませんか?
WMIで100%確実にCOMポートの情報を取得できるわけではありません。
もっと言いますと・・・
PCIボードのCOMポート増設タイプやPCMCIAカードでのCOM増設を含め
USB変換タイプのCOMポート増設の各種ドライバーは、メーカーの責任
においてWindows互換ポートとしてその情報をレジストリに登録する
のですが、行儀が悪いと言うか・・・WMIで取得できる正しい情報を
レジストリに登録するわけではないのです。
ただしCOMポートとしては正しく動作するわけで・・・
よって苦肉の策としては、COM1〜COM256までをループさせながら順次
オープンしてオープンできれば『ある』、できない場合は『ない』と
判断してCOMポートの存在を確認していくしか無いのです。
やったことは無いのですが、行儀の悪いメーカーのCOMポートの登録
情報で、不足している部分を正しくレジストリに書き込んでやれば、
WMIでも取得が可能になるはずです。なんせ無い情報を追加するわけ
ですから多分問題ないはずなんですが・・・
後は上記に書かれているRS-232Cでは無いポートを、あたかもRS-232C
かのように見せかけるものが、はたしてマイクロソフトのシリアルド
ライバの規約に沿っているのかどうか・・・
残念ながらRS-422/485はシリアルドライバの範疇外だと思いますので
WMIで情報が取れないと文句を言ってもメーカー責任では無いでしょう。
以上。
ツイート | ![]() |