COMポートのハンドルについて

タグの編集
投稿者 ザーボン  (社会人) 投稿日時 2014/7/15 10:34:10
VBをちょっとかじった程度のレベルです。

エクセルのVisual Basic 6.0でWin32APIを用いてRS-232Cで通信するプログラムを作っています。
パソコンにシリアルポートがないのでUSB変換ケーブルで通信します。

CreateFile()でポートを開き、常時受信状態で待機し、1時間毎のデータを受信します。受信するとCloseHandle()でシリアルポートをクローズし表に書き込み、再びポートを開いて受信状態にを繰り返すプログラムです。24時間365日起動させたままです。

この状態で何かしらのエラーやESCを押すなどでプログラムが終了すると、ポートは開きっぱなしになってしまい、再び通信を開始してもCOMポートのハンドルが-1になり、ポートが開けなくなってしまいます。
こうなるとエクセルを立ち上げなおすか、USB変換ケーブルを抜き差ししないとポートが開けません。

ほとんど無知の状態からネットで調べてプログラムを完成させましたが、上記の不具合だけどうしていいかわかりません。

サブクラス化で応用すればOK!みたいなのがありましたが、もっと簡単にできないでしょうか?

今ポートを開いた際、ハンドル値を保持しておき、エラー等でプログラムが終了したら通信開始ボタンを押したタイミングで保持していたハンドル値でポートを閉じて、その後に上記プログラムが開始する様に考えていますがうまくいきません。

以上、説明が下手で申し訳ありませんがアドバイス頂けると助かります。よろしくお願いいたします。
投稿者 kiku  (社会人) 投稿日時 2014/7/16 09:59:48
>今ポートを開いた際、ハンドル値を保持しておき、
>エラー等でプログラムが終了したら通信開始ボタンを
>押したタイミングで保持していたハンドル値でポートを閉じて、
>その後に上記プログラムが開始する様に考えていますがうまくいきません。

この文面からエラーやESCでプログラムが終了した後に、
再度プログラムを起動して、閉じられていないポートを閉じようとしている
というように解釈しました。

プログラムが終了する直前のイベントで
ポートを閉じるようにする必要があると思います。

このような方向性で改修可能でしょうか?

またExcelのマクロなのか、VB6.0でExcelを制御しているのか
わからないのですが、どちらにしても24時間動作させるような
プラットホームではないような気がします。

たぶん、そうならざるを得ない理由があるのではないかと
思いますが、最新の環境でプログラムを開発した方が良いと思います。
VB.NETとかになると思いますが、初心者でここまでできたことを
考えると、今からでも遅くないように推測します。
投稿者 ザーボン  (社会人) 投稿日時 2014/7/16 11:38:52
返答ありがとうございます。

申し訳ありません。エクセルのマクロで作ってます。
開発ソフトがないのでエクセルで作っています。
やはりエクセルマクロでは難しいですか。
今回調べていく中でVB.NETに興味がわいたので今後勉強していきます。

今回はエクセルマクロで何とかしたいのでこのままがんばります。

>この文面からエラーやESCでプログラムが終了した後に、
>再度プログラムを起動して、閉じられていないポートを閉じようとしている
>というように解釈しました。
>プログラムが終了する直前のイベントで
>ポートを閉じるようにする必要があると思います。
>このような方向性で改修可能でしょうか?

プログラム終了する前にポートを閉じることができたら解決できると思います。
プログラムが終了する直前のイベントってことはサブクラス化が必要になるということでしょうか?
投稿者 kiku  (社会人) 投稿日時 2014/7/16 13:21:39
>プログラム終了する前にポートを閉じることができたら解決できると思います。
>プログラムが終了する直前のイベントってことはサブクラス化が必要になるということでしょうか?

私自身は使ったことがないのですが
検索すると下記のイベントがあるようです。
サブクラス化は必要ありません。

Workbook_BeforeCloseイベント
http://www.relief.jp/itnote/archives/002947.php
投稿者 ザーボン  (社会人) 投稿日時 2014/7/17 09:54:47
エラー発生時にエクセルは閉じられず、マクロだけ終了するのでマクロが終了する前にポートを閉じたいのですが、このマクロ版みたいなのがあればいいんですけど(^_^;

多分無理そうなのでポートをデータ受信するタイミングの一瞬のみ開閉するプログラムへの変更を検討してみます。
投稿者 kiku  (社会人) 投稿日時 2014/7/17 10:04:23
>エラー発生時にエクセルは閉じられず、
>マクロだけ終了するのでマクロが終了する前にポートを閉じたいのですが、
>このマクロ版みたいなのがあればいいんですけど(^_^;

実行時エラーについては、下記のようにエラーをハンドリングすることができます。
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_140_02.html

エラー処理の中でポートを閉じればいいのかなと
思っていました。

>多分無理そうなのでポートをデータ受信するタイミングの
>一瞬のみ開閉するプログラムへの変更を検討してみます。 

この仕様で良いのであるならば
その対処が早いですね。
投稿者 ザーボン  (社会人) 投稿日時 2014/7/18 07:46:24
これなら出来そうな気がします!

ありがとうございました!

一瞬のみの開閉は無理でした(;_;)