josedelrio
asked on
Problems calling Timer.Enabled=True from SerialPort.DataReceived in VB .NET05
I am trying to enable a timer from a SerialPort.DataReceived rutine. The thing is not working and I suspect it is because I am calling Timer10.Enabled=true from an independent subprocess. I tried to use a delegate defined within a module but I didn't succeed. It is VB .NET 05 and this is the fragment of code:
Private Sub SerialPort1_DataReceived(B yVal sender As Object, ByVal e As System.IO.Ports.SerialData ReceivedEv entArgs) Handles SerialPort1.DataReceived
comando = SerialPort1.ReadTo(";")
inicial = Mid(comando, 1, 4)
Select Case inicial
Case "VERS"
Timer1.enabled=false ' This works fine ! but Timer10.Enabled=True don't
Dim msd As Midelegado = AddressOf Me.ActivaTimer10
msd.Invoke(True)
End Select
End Sub
In a Module:
Public Delegate Sub Midelegado(ByVal a As Boolean)
In the Form (Form1):
Sub ActivaTimer10(ByVal a As Boolean)
Timer10.Enabled = a
End Sub
Of course in the program there are more things but these are the relevant ones for the current case.
The program was made with VB6.0 and converted to .NET05 and then modified to use SerialPort instead of MSComm. I checked the serial port sub is working properly and data is being read. I save to copy the Serial port inicialization and so forth.
I have got no error msg but the Timer is not activated. In fact, after the data arrive in the serial port, I can't activate the Timer even from a button on the form.
Thanks in advance
Josedelrio
Private Sub SerialPort1_DataReceived(B
comando = SerialPort1.ReadTo(";")
inicial = Mid(comando, 1, 4)
Select Case inicial
Case "VERS"
Timer1.enabled=false ' This works fine ! but Timer10.Enabled=True don't
Dim msd As Midelegado = AddressOf Me.ActivaTimer10
msd.Invoke(True)
End Select
End Sub
In a Module:
Public Delegate Sub Midelegado(ByVal a As Boolean)
In the Form (Form1):
Sub ActivaTimer10(ByVal a As Boolean)
Timer10.Enabled = a
End Sub
Of course in the program there are more things but these are the relevant ones for the current case.
The program was made with VB6.0 and converted to .NET05 and then modified to use SerialPort instead of MSComm. I checked the serial port sub is working properly and data is being read. I save to copy the Serial port inicialization and so forth.
I have got no error msg but the Timer is not activated. In fact, after the data arrive in the serial port, I can't activate the Timer even from a button on the form.
Thanks in advance
Josedelrio
ASKER
kdwood,
On Form1. I dragged SerialPort on the Form1 and then selected the event SerialPort1.ReceivedData.
I hope it helps you to help me.
Thanks in advance.
Regards,
josedelrio
On Form1. I dragged SerialPort on the Form1 and then selected the event SerialPort1.ReceivedData.
I hope it helps you to help me.
Thanks in advance.
Regards,
josedelrio
Josedelrio,
Are you sure that your code is making it to the CASE "VERS" section. Try putting a message box just before the msd.Invoke(True). The reason I ask this is because I don't see any reason why the timer shouldn't start. In fact I created a little test project based based on your code which I included below. The only difference is that I could not simulate the serial port data capture in my sample.
------
In Form1:
Private Sub ActivaTimer10(ByVal a As Boolean)
Me.Timer1.Enabled = a
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myTestVal As Integer = 2
Dim msd As Midelegado = AddressOf Me.ActivaTimer10
Select Case myTestVal
Case 2
msd.Invoke(True)
End Select
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
MsgBox("The Timer Has Ticked")
End Sub
-----------
In Module1:
Public Delegate Sub Midelegado(ByVal a As Boolean)
Are you sure that your code is making it to the CASE "VERS" section. Try putting a message box just before the msd.Invoke(True). The reason I ask this is because I don't see any reason why the timer shouldn't start. In fact I created a little test project based based on your code which I included below. The only difference is that I could not simulate the serial port data capture in my sample.
------
In Form1:
Private Sub ActivaTimer10(ByVal a As Boolean)
Me.Timer1.Enabled = a
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myTestVal As Integer = 2
Dim msd As Midelegado = AddressOf Me.ActivaTimer10
Select Case myTestVal
Case 2
msd.Invoke(True)
End Select
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
MsgBox("The Timer Has Ticked")
End Sub
-----------
In Module1:
Public Delegate Sub Midelegado(ByVal a As Boolean)
ASKER
I am sure the program enters the "VERS" case. I checked the Timer1 (which is sending a msg through the serial port) and stopts when "VERSION;" is received. Still I put a Debug.Print("I am going through") and I could see it printed in the screen when "VERSION;" is received. It seems that SerialPort1.DataReceived is a separate subprocess in a separate thread, but I have not a clear idea about what that means and which are the implications.
Thanks again
Regards,
josedelrio
Thanks again
Regards,
josedelrio
Just for further clarification, If you put a Debug.Print message inside of the ActivaTimer10 sub, does it make it there after the msd.Invoke is called?
ASKER
No, it doesn't. Even if I try to activate the Timer from a button on the form, I can't, AFTER the "VERSION;" msg arrives. It works fine (the button) prior to the arrival though.
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
ASKER
This works fine in my code just for updating the content of a textBox and must work the same with the timer (I tryed before the textbox and in my way failed too). So I will try soon the complet thing in my application and I am sure it will work fine.
Many thanks for your support, the article you have found is very good.
josedelrio
Many thanks for your support, the article you have found is very good.
josedelrio
My pleasure, glad I could help.
Where does you serial port routine reside? On Form1 or in a module?
Regards,
Keith