COMの名前の取出


landy  2006-10-05 01:49:55  No: 133546

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のプログラム自体とはちょっと関係ない気がしてきましたが、
なにかヒントはありませんでしょうか・・・


ヤマ@文系  2006-10-10 06:27:30  No: 133547

レスがついてないので、苦手なのですが回答しておきます。
.NETになってからCOMポート自体いじっていませんが、
WMIみたいなのではなく、
COMコントロール(Mscomm)を使って、
ATコマンド送ってやれば取れませんか?


オショウ  2006-10-10 13:55:35  No: 133548

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で情報が取れないと文句を言ってもメーカー責任では無いでしょう。

以上。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加