VB6にて、MSCommを使いRS232Cでターゲット機器と通信します。
ターゲット機器との間は、あるプロトコルで通信します。
まず、最初に接続要求を送信します。
ターゲット機器からこの接続要求に対して、ACKが帰ってきた場合に接続成功です。
リンクが確立したかどうか確認したいのですが、以下のような場合が考えられます。
(1)ACKではなくNAKが帰ってきた場合
(2)意味のないコードを受信した時(経路のノイズ/通信速度の違い)
(3)応答がない場合(タイムアウト)
上記において、(1)、(2)は対応できるのですが、(3)の場合どのようにして判断すれば良いのでしょうか?
よろしくお願いします。
タイマーコントロールのIntervalに適当なタイムアウト時間をセットして
接続要求を投げた直後にタイマーを開始する。
タイマーイベントが発生する前に何かを受信したときはタイマーを止める。
タイマーイベントが発生したらタイムアウトとして処理をする
みたいな感じでしょうか。
abuさん、ありがとうございます。
タイマーコントロールを使えばいいのかな、とは思っていたのですが、
・タイマーを開始する
・タイマーを止める
の具体的な処理が分かりません。
タイマーを開始するのは、
Timer1.Interval = 2000
で、
止める場合、
Private sub Timer1_Timer()
'ここで、エラー処理
End sub
とやるのだと思いますが、このタイマー処理が終わったら、処理自体は
どこへ行くのでしょうか?
・タイマーを開始する
Timer1.Enabled=True
・タイマーを止める
Timer1.Enabled=False
ですね。
タイマーを止めるのは
・受信時
・タイマーイベント内
の2箇所。
>とやるのだと思いますが、このタイマー処理が終わったら、処理自体は
>どこへ行くのでしょうか?
データーをどのように取得しているかにもよりますが、
Do 〜Loop内で取得しているのであれば、グローバルでフラグを設定し、
タイマーでタイムアップしたらフラグをセットし、Do〜Loopの中で
フラグを見ていて、フラグがセットされていればタイムアップとしてLoopを抜けるとか。
>とやるのだと思いますが、このタイマー処理が終わったら、処理自体は
>どこへ行くのでしょうか?
VBはイベント型プログラムなので、タイマの後何もコードを書いていなければ
(どっか自分で関数とかに飛ばしてなければ)
特にコードは実行されません(待機状態)
でユーザがコマンドボタンを押すとか何かイベントが発生すれば、
それに応じたプロシージャのコードが実行されます。
…って答え方でいいのかな(^^;)
みなさん、アドバイスありがとうございます。
御礼が遅くなり申し訳ありません。
おかげさまで解決しました。
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()は省略。
以上、ありがとうございました。
ツイート | ![]() |