[VB.NET 2005] Object timer geeft geen Tick

Pagina: 1
Acties:

  • BlackBurn
  • Registratie: Juni 2001
  • Laatst online: 21:00

BlackBurn

One Ring To Rule Them All

Topicstarter
Ik ben voor me werk een beetje aan het spelen met VB.NET 2005 (Express Editie) en probeer een programmatje de com-port uit te laten lezen.

Dit lukt allemaal vrij goed, alleen loopt er tijdens het uitlezen een telletje mee, die het aantal tabs telt die het programma doorgeeft en na een X aantal tabs een enter geeft. Dit werkt ook nog goed.

Alleen is het nu de bedoeling dat de teller weer op 0 gezet wordt, als er geen data wordt ontvangen.

Dit is mijn code.

Ik heb twee publieke variablen

Visual Basic:
1
2
Dim intCount As Integer
Dim intTimer As Integer


Deze worden in de form_load keurig op 0 gezet.
Hierna heb ik een sub die reageert als er data ontvangen wordt.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Public Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles objSerialPort.DataReceived
        'Uitlezen in BYTE MODE
        If objTimer.Enabled = False Then
            objTimer.Enabled = True
        End If
        intTimer = 0
        Dim strTmp As String
        Dim intloop As Integer
        Dim intBytes As Integer
        Dim arrBuffer As Byte()
        strTmp = ""
        intBytes = objSerialPort.BytesToRead
        ReDim arrBuffer(intBytes)
        objSerialPort.Read(arrBuffer, 0, intBytes)
        For intloop = 0 To intBytes
            If arrBuffer(intloop) > 128 Then arrBuffer(intloop) -= 128
            txtInput.Text += Chr(arrBuffer(intloop))
            strTmp += Chr(arrBuffer(intloop))
        Next

        strTmp = Replace(strTmp, " ", "")
        strTmp = Replace(strTmp, "FUNC01", "X")

        For intloop = 1 To Len(strTmp) - 1
            If Mid(strTmp, intloop, 1) = "X" Then
                intCount += 1
                If intCount = 120 Then '3 enters per regel er zijn 40 regels 40x3=120 :)
                    SendKeys.SendWait("{enter}")
                    intCount = 0
                Else
                    SendKeys.SendWait("{tab}")
                End If
            Else
                SendKeys.SendWait(Mid(strTmp, intloop, 1))
            End If

        Next
        
        txtInput.Text = Replace(txtInput.Text, "FUNC01", vbCrLf)
    End Sub



Zoals je ziet in het begin wordt de timer geactiveerd, en wordt elke keer als er data ontvangen wordt, intTimer op 0 gezet.

Nu zou er bij elke tick het volgende moeten gebeuren.

Visual Basic:
1
2
3
4
5
6
7
8
    Private Sub objTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles objTimer.Tick
        intTimer += 1
        If intTimer = 2 Then
            intTimer = 0
            intCount = 0
            objTimer.Enabled = False
        End If
    End Sub


Dus als er geen data ontvangen wordt, zou er naar mijn inziens de intTimer bij de 10 moeten komen en de variabele intCount netjes op 0 te zetten.

Als ik een breakpoint plaats, dan zie ik netjes dat de timer geactiveerd wordt, maar de tick event wordt niet bereikt, iemand enig idee?

If it is broken, fix it. If it ain't broken, make it better!


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Start je de timer wel?
als in:
Visual Basic:
1
objTimer.Start()

Nu met Land Rover Series 3 en Defender 90


  • BlackBurn
  • Registratie: Juni 2001
  • Laatst online: 21:00

BlackBurn

One Ring To Rule Them All

Topicstarter
MTWZZ schreef op woensdag 16 november 2005 @ 18:07:
Start je de timer wel?
als in:
Visual Basic:
1
objTimer.Start()
Dit deed ik inderdaad niet (dacht dat de timer gestart werd als je hem enabled zette).
Heb nu onder enabled= true er ook bij gezet objTimer.Start(), maar dit geeft helaas ook geen resultaat.

If it is broken, fix it. If it ain't broken, make it better!


  • BlackBurn
  • Registratie: Juni 2001
  • Laatst online: 21:00

BlackBurn

One Ring To Rule Them All

Topicstarter
Denk dat het probleem opgelost is, na enig speurwerk kwam ik erachter dat .NET 3 soorten timers kent.

namelijk:
Windows.forms.form.timer
System.timers.timer
System.threading.timer

In mij geval maakte ik gebruik van de Windows.forms.form.timer, deze heb ik gewijzigd naar een System.timers.timer.

Als eerste maak ik het object aan
Visual Basic:
1
Dim objTimer As New System.Timers.Timer


In de load event, stel ik de timer in en koppel ik een event.

Visual Basic:
1
2
3
4
5
6
7
8
9
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler objTimer.Elapsed, AddressOf OnTime
        objSerialPort.Open()
        Control.CheckForIllegalCrossThreadCalls = False
        intCount = 0
        intTimer = 0
        objTimer.Interval = 1000
        objTimer.Enabled = False
    End Sub


Nu roep ik de timer in mijn Datareceived op dezelfde manier aan als hiervoor.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    Public Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles objSerialPort.DataReceived
        'Uitlezen in BYTE MODE
        If objTimer.Enabled = False Then
            objTimer.Enabled = True
        End If
        ' objTimer.Stop()
        intTimer = 0
        Dim strTmp As String
        Dim intloop As Integer
        Dim intBytes As Integer
        Dim arrBuffer As Byte()
        strTmp = ""
        intBytes = objSerialPort.BytesToRead
        ReDim arrBuffer(intBytes)
        objSerialPort.Read(arrBuffer, 0, intBytes)
        For intloop = 0 To intBytes
            If arrBuffer(intloop) > 128 Then arrBuffer(intloop) -= 128
            txtInput.Text += Chr(arrBuffer(intloop))
            strTmp += Chr(arrBuffer(intloop))
        Next

        strTmp = Replace(strTmp, " ", "")
        strTmp = Replace(strTmp, "FUNC01", "X")

        For intloop = 1 To Len(strTmp) - 1
            If Mid(strTmp, intloop, 1) = "X" Then
                intCount += 1
                If intCount = 120 Then '3 enters per regel er zijn 40 regels 40x3=120 :)
                    SendKeys.SendWait("{enter}")
                    intCount = 0
                Else
                    SendKeys.SendWait("{tab}")
                End If
            Else
                SendKeys.SendWait(Mid(strTmp, intloop, 1))
            End If

        Next

        txtInput.Text = Replace(txtInput.Text, "FUNC01", vbCrLf)
    End Sub


En als laatste de code in de timer ontime event.

Visual Basic:
1
2
3
4
5
6
7
8
Private Sub OnTime(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
        intTimer += 1
        If intTimer = 10 Then
            intTimer = 0
            intCount = 0
            objTimer.Enabled = False
        End If
    End Sub


Nu nog goed testen, maar ziet er goed uit, voor meer informatie:
http://msdn.microsoft.com.../TimersinNET/default.aspx

If it is broken, fix it. If it ain't broken, make it better!