2

COM ポート経由でデータを送信し、タイマーを 4000 間隔で開始して、4 秒以内に何も受信しなかった場合にメッセージを送り返します。

{ロード}

Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    [...]    
    SendCard(0)
    [...]
End Sub

{SendCard Sub} ポート経由でデータを送信するプロパティ「LastCommand」を設定して、この Sub 経由で必要な情報を送信します。

Private Sub SendCard(ByVal cardIndex As Integer)
    If cardIndex < Setting.Machine.Cards.Length Then

        'Calling LastCommand's Set()
        LastCommand = "*" & Setting.Machine.Cards(cardIndex) & ": STRQ" & ControlChars.CrLf
    Else
        'Blah blah...
    End If

End Sub

プロパティはデータを送信し、タイマーを開始します。

Public Property LastCommand() As String
    Get
        Return lastCommandString
    End Get
    Set(ByVal value As String)
        lastCommandString = value
        MainCOMSerialPort.Write(value)
        ResponseTimer.Start()
    End Set
End Property

答えを受け取ったらタイマーを止めて、次のカードの情報を尋ねます。

Private Sub MainCOMSerialPort_DataReceived(...)
   [...]
   ResponseTimer.Stop() 'After this stop it does not trigger the Tick event any longer.
   SendCard(Array.IndexOf(Setting.Machine.Cards, CardString) + 1) 'Sending the next card
   [...]
End Sub

tick イベントは最初のカードで正常に動作します

Private Sub ResponseTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ResponseTimer.Tick
    'MessageBox.Show("No Respone Yet")
    LastCommand = LastCommand
End Sub

そのため、何かが返されるまで4秒ごとに最初のコマンドを要求していますが、2番目のコマンドでやり直すと、タイマーは作動しません。

.NET 4.0 と {Windows.Forms.Timer} を使用しています。Timers.Timer を試してみましたが、動作しませんでした。なぜ再起動しないのかわかりません。

4

2 に答える 2

0

System.Timers.Timer は、コマンドを送信するたびに4秒ごとに経過イベントをトリガーすることができた最良のオプションのように見えました。

于 2012-11-08T18:56:06.380 に答える
0

プロパティ 'LastCommand' チェック値が lastCommandString と等しくないこと、および ResponseTimer が有効になっていない場合は、おそらく役立つでしょう:

Public Property LastCommand() As String
    Get
        Return lastCommandString
    End Get
    Set(ByVal value As String)
        if value = lastCommandString then exit property
        lastCommandString = value
        MainCOMSerialPort.Write(value)
        if Not ResponseTimer.Enabled Then ResponseTimer.Start()
    End Set
End Property
于 2012-11-08T18:41:05.560 に答える