VB6でMSCommを使い、エラー処理をするには?

解決


えーじ  2005-01-18 22:10:27  No: 87892  IP: [192.*.*.*]

VB6にて、MSCommを使いRS232Cでターゲット機器と通信します。
ターゲット機器との間は、あるプロトコルで通信します。
まず、最初に接続要求を送信します。
ターゲット機器からこの接続要求に対して、ACKが帰ってきた場合に接続成功です。
リンクが確立したかどうか確認したいのですが、以下のような場合が考えられます。
(1)ACKではなくNAKが帰ってきた場合
(2)意味のないコードを受信した時(経路のノイズ/通信速度の違い)
(3)応答がない場合(タイムアウト)
上記において、(1)、(2)は対応できるのですが、(3)の場合どのようにして判断すれば良いのでしょうか?
よろしくお願いします。

編集 削除
abu  2005-01-18 22:38:43  No: 87893  IP: [192.*.*.*]

タイマーコントロールのIntervalに適当なタイムアウト時間をセットして
接続要求を投げた直後にタイマーを開始する。
タイマーイベントが発生する前に何かを受信したときはタイマーを止める。
タイマーイベントが発生したらタイムアウトとして処理をする

みたいな感じでしょうか。

編集 削除
えーじ  2005-01-18 23:21:58  No: 87894  IP: [192.*.*.*]

abuさん、ありがとうございます。
タイマーコントロールを使えばいいのかな、とは思っていたのですが、
・タイマーを開始する
・タイマーを止める
の具体的な処理が分かりません。

タイマーを開始するのは、
Timer1.Interval = 2000
で、
止める場合、
Private sub Timer1_Timer()
  'ここで、エラー処理
End sub
とやるのだと思いますが、このタイマー処理が終わったら、処理自体は
どこへ行くのでしょうか?

編集 削除
みい  2005-01-18 23:42:23  No: 87895  IP: [192.*.*.*]

・タイマーを開始する
  Timer1.Enabled=True
・タイマーを止める
  Timer1.Enabled=False
ですね。
タイマーを止めるのは
・受信時
・タイマーイベント内
の2箇所。

編集 削除
ねろ  2005-01-19 09:23:53  No: 87896  IP: [192.*.*.*]

>とやるのだと思いますが、このタイマー処理が終わったら、処理自体は
>どこへ行くのでしょうか?
データーをどのように取得しているかにもよりますが、
Do 〜Loop内で取得しているのであれば、グローバルでフラグを設定し、
タイマーでタイムアップしたらフラグをセットし、Do〜Loopの中で
フラグを見ていて、フラグがセットされていればタイムアップとしてLoopを抜けるとか。

編集 削除
フォレスト  2005-01-19 10:36:36  No: 87897  IP: [192.*.*.*]

>とやるのだと思いますが、このタイマー処理が終わったら、処理自体は
>どこへ行くのでしょうか?

VBはイベント型プログラムなので、タイマの後何もコードを書いていなければ
(どっか自分で関数とかに飛ばしてなければ)
特にコードは実行されません(待機状態)
でユーザがコマンドボタンを押すとか何かイベントが発生すれば、
それに応じたプロシージャのコードが実行されます。
…って答え方でいいのかな(^^;)

編集 削除
えーじ  2005-01-20 22:17:09  No: 87898  IP: [192.*.*.*]

みなさん、アドバイスありがとうございます。
御礼が遅くなり申し訳ありません。
おかげさまで解決しました。
Public変数TimeOut(boolean)を定義しておいて、送信時に
(1)タイマインターバル設定
(2)タイマ許可
その後、Do〜Loop文の中で、ターゲットからの応答を待ちます。
Loopの中でTimeOutをチェックしTrueになっていたら、Doループから
抜けて、タイマを停止(Enabled=False)し、Exit Subを実行。
TimeOutは、Private Sub Timer1_Timer()の中でセットしています。

Public Sub Trans()
           |
  MSComm1.Output = strSendData
  TimeOut = False 'Public変数
  Timer1.Interval = 2000
  Timer1.Enabled = True
  Do While MSComm1.InBufferCount < 2
     DoEvents
     If TimeOut = True Then
       Exit Do
     End If
  Loop
           |
End Sub

Private Sub Timer1_Timer()は省略。
以上、ありがとうございました。

編集 削除