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

解決


えーじ  2005-01-19 07:10:27  No: 87892

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


abu  2005-01-19 07:38:43  No: 87893

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

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


えーじ  2005-01-19 08:21:58  No: 87894

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

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


みい  2005-01-19 08:42:23  No: 87895

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


ねろ  2005-01-19 18:23:53  No: 87896

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


フォレスト  2005-01-19 19:36:36  No: 87897

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

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


えーじ  2005-01-21 07:17:09  No: 87898

みなさん、アドバイスありがとうございます。
御礼が遅くなり申し訳ありません。
おかげさまで解決しました。
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()は省略。
以上、ありがとうございました。


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

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






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