- PR -

COMポートに接続されたことを検出する

投稿者投稿内容
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-04-12 10:08
いつもお世話になっております。

OS:XP VisualStudio2005 C# にてWindowsアプリケーションを作成しております。
COMポートに接続されたら発生するイベントがないか探しております。
SerialPortクラスを見てみましたがありませんでした。

どなた様かご教授ください。
いつもいつも申し訳ありません。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-04-12 13:23
「COMポートに接続されたら」というのが、具体的にどういうタイミングのことを指しているのか分かりにくいです。

SerialPort.Open() が例外を throw しなければ、基本的に COM ポートは使用可能だということです。

そうではなくて、例えば「COM ポートにケーブルが接続されたこと」を知りたいのであれば、それは出来ません。

COM ポートには「ケーブルが接続されたこと」を検知する機能が無いからです。

あるいは、「通信相手となる機器が COM ポートに(シリアルケーブルで)接続されたこと」知りたいのでしょうか?

そうだとしても、所詮 COM ポートは太古のテクノロジーなので、かなり制限があります。

まず、ケーブル接続された機器が通信可能な状態(PC側で言うと SerialPort.Open() した後と同等)でなければ、機器がケーブル接続されたことを検知できません。

機器が通信可能な状態で、かつその機器が COM ポートの主要な制御線を活用しているなら、SerialPort.PinChanged イベントによってそれらの制御線の状態変化を知ることが出来ます。

CD, CTS, DTR などの信号線の変化を監視すれば、「機器と通信可能な状態であること」が分かります。

ただし、機器がそれらの制御線を使用しているのであれば、の話ですし、どの「制御線を使っているか」もその機器次第なので、通信相手となる装置の仕様をよく確認してから試してください。
moco
ベテラン
会議室デビュー日: 2006/05/01
投稿数: 54
投稿日時: 2007-04-12 14:03
渋木宏明(ひどり)さん、ご回答本当にありがとうございます。

検出したいのは、
「通信相手となる機器が COM ポートに(シリアルケーブルで)接続されたこと」です。
いただいたアドバイス非常に参考になりました。

やりたいのは、自社製の機器がPCに接続されたとき、
COMポートに接続された機器が、自社製の機器か自動判別し、
機器が持つデータを自動受信させたいと考えております。

機器が物理的に接続されているか、わからない状況ですので、
SerialPort.Open()もできません。

センスないかもしれませんが、
タイマーでSerialPort.GetPortNames()の中身を定期チェックし、
追加されたCOMポートがあれば、そこに対し通信を開始したいと思います。

やっぱセンスないでしょうか。。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-04-12 14:49
引用:

機器が物理的に接続されているか、わからない状況ですので、
SerialPort.Open()もできません。



なこたありません。
機器の接続の有無に関わらず、COM ポートは「そこ」にあります。

機器が接続されていなくても、PCに COM ポートが装備されて(かつ、ドライバが正しくインストールされて)いれば利用可能です。

(通信相手となる)機器が接続されてから「生えてくる」ようなものではありません。

なので、機器が接続されていない状態で SerialPort.Open() を実行しても例外が発生したりはしません。

あれこれ悩む前に、試してみればすぐに分かります。


rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2007-04-12 15:17
今日は

渋木宏明(ひどり)さんが言われている様に制御線を使えばSerialPort.PinChanged イベントで接続を検知できると思います、相手が自作ならどうにでもなると思います。
もし、制御線が使われていないなら、空いている制御線に電圧を加えれば使えます。
多分コネクタ内の折り返しでも出来たと思います。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2007-04-12 16:29
関連する用語
プラグアンドプレイ
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%83%97%E3%83%AC%E3%82%A4
TAD
ベテラン
会議室デビュー日: 2007/03/20
投稿数: 52
お住まい・勤務地: 海のそば
投稿日時: 2007-04-12 18:31
引用:
機器が物理的に接続されているか、わからない状況ですので、
SerialPort.Open()もできません。

センスないかもしれませんが、
タイマーでSerialPort.GetPortNames()の中身を定期チェックし、
追加されたCOMポートがあれば、そこに対し通信を開始したいと思います。


とおっしゃられているあたり、USB-シリアル変換を経由している場面を想像して
しまうのですが...
前提として、PC本体(あるいは拡張カード)の、決まったコネクタに接続する(COM1とか
COM2とかが決め打ちできる)という考えでいいんですよね?

それから、
引用:
もし、制御線が使われていないなら、空いている制御線に電圧を加えれば使えます。


機器にフロー制御の設定があってハードフロー制御に設定できれば制御線を使うように
なりますが、それ以外の制御はほとんど真面目に行わないのが普通かも。相手の機器の
仕様(この辺ドキュメントに書いてないことも多いから現物を見ることになりそうですが)
も調べておいた方がよさそうに思います。
明日のSE
会議室デビュー日: 2004/03/29
投稿数: 16
お住まい・勤務地: 茨城の田舎
投稿日時: 2007-04-12 19:12
USB-シリアル変換を経由して、USB側を抜き差しならいいのですが、
シリアルポートの電源投入状態での抜き差しは危険です。
最悪ハードを壊します。
シリアルポートは大昔の規格なので、ホットプラグをサポートしてないことをお忘れ無く
なので、接続された事を検知する方法が無い理由も、ここにあります。

スキルアップ/キャリアアップ(JOB@IT)