C++のプログラムでシリアル通信を制御しているのですが、
ポートにシリアルケーブルがささったかどうかの判断はプログラムで可能でしょうか?
接続可能なポート(有効なポートではなく)一覧を表示することが目的です。
方法がありましたらご教示をお願い致します。
「シリアル通信」にもいろんな種類がありますが、RS232cに限定するとケーブルの接
続有無は判定できません。
USBもケーブルだけではダメで、機器IDが取得できるものがぶら下がっていないとダメ
だった記憶があります。
> ポートにシリアルケーブルがささったかどうか
は、そういうケーブル+機器であれば判断できる。
(ささったという状況を EIA574 的にどう定義するかで実装方策は違うだろう)
できるが、それを調べるためにはあらかじめシリアルポートを開いておく必要があり
> 接続可能なポート と 有効なポート
を調べるためにシリアルポートを開いておく必要があることになる。
卵が先か鶏が先か・・・になりそうだけど、大丈夫?
EIA574/232 という仕様そのものがこういう plug&play を想定していないものなので
凝ったことをしても手間の割に得るものが少ない。
俺なら「真に」一覧を表示 COM1, COM2, COM3.... とするだけでやめとくだろう。
(ポートの有無や、その先の機器の有無など一切チェックしないでユーザ任せ)
できません。
実際に通信ができるかどうかは、相手の応答を正常に
受信できるまで、わかりませんので、その検査が正常で
あっても、あまり慰めにはなりません(vv;)。
また、通信では
1.いつでもインフラが破壊される可能性がある。
2.有限の時間内で応答が返されることを仮定してはならない。
ですので、当初正常であっても、たいした意味はありません。
従って、仮にご質問の機能があったとしても
>接続可能なポート(有効なポートではなく)一覧を表示することが目的です。
は、厳密に言うと「さっき検査したときは正常だったポート」を
一覧しているに過ぎません。つまり極端なことを言えば、
「次の通信が正常に行える保障が得られたわけではない」
という点が重要だと考えます。
うーーん、
シリアル通信で接続を確認するのに普通、テスト通信ってのを行なう。
「山」→ 「川」っていうようにあらかじめ互いの通信コードを決めておく。
相手の機器をテストモードにして通信ポートを開いておく。
後は,PC起動時に「山」に相当するコードを送信し、相手機器は「川」に相当する
コードを返す。
PCは、「川」に相当するコードを受信すると通信可の表示をする。
受信できなかった場合は、何度かリトライしてそれでもだめな場合は通信不可能
の表示を出してそのまま終了する。
通信可の表示が出たら、相手機器はテストモードをOFFにする。
ってなかんじかな?
まあ、USBのplug&play も似たようなことをやっています。
接続可能なポートといっても,そこに繋がる機器はまちまちで
どれでもいいからオープンできるポートが知りたいって
わけじゃないと思うので,
接続したい機器にCTSやDSRを知らせる仕組みを施す
(機器側で4-6/7-8をショートとかでもいいしね)
それで,CTSやDSRを走査してみては?
あとは,接続許可的なコマンドを用意しておいて,
一度だけ通信させちゃうとかね
あ,全部機器の改造が前提ですねwww
以前にも同じような話題が出てきたように記憶していますが、
確かそのときも確実に使用できるポートをリストアップするのは無理と言う
結論になったような気がします。
特に通信周りはセンスした時は使えてもいざ利用しようとしたら使えない
と言う状況も容易に想像できるので苦労して実装しても報われないし、
利用者側も嬉しく無いという状況も考えられるからですね。
リストとして表示してそこから選択させたいという意味では、
その環境で使用できるポート番号をユーザーに登録してもらって
そこから選択してもらうというのもあったような気がします。
少なくとも毎回入力する手間は省けるので折衷案としては悪く無いと思います。
現在通信可能なポートではなく例えば有効なComポートの一覧みたいのが
必要なら出来そうな気がします。
システムのハードウェアの一覧で表示されそうな物とか。
あれは何も繋がっていなくてもBIOSで有効にしていれば
勝手に出て来ますよね?
そっちの話じゃないかと思うんですけど。
SetupDi系の関数は
http://support.microsoft.com/kb/259695/ja
はご存じですか?
多分この延長で目的のことが実現できそうですけどいかがでしょうか?
>多分この延長で目的のことが実現できそうですけどいかがでしょうか?
ユニークID, Device名等,検索の手がかりになるものを調べた後にSetupDi系の関数
で検索しないと
すべてのデバイスを列挙した後、闇雲に必要なデバイスを探すことになります。
今回は、システムもしくはUSBのインターフェースのデバイスを探して、そこから
RS-232Cに関係するデバイスを探さないとだめになりますね。
RS-232Cに関係するデバイスを見つけてもそこからCOMポートを見つけることが
できるかどうかも分かりません。
結局、ID・その他を見つけるためにデバイスマネージャを起動することになると
思います。
それならば、デバイスマネージャでCOMポートを探す方法を示して、オペレータに
調べてもらった方が得策ですね。