Visual Basic.NET - Problema con el Puerto Serie

 
Vista:
sin imagen de perfil

Problema con el Puerto Serie

Publicado por Spiral (8 intervenciones) el 28/02/2016 10:16:41
Hola a todos y de antemano muchas gracias.

Bien soy nuevo por esta comunidad de foros y nuevo en la programación con Visual .NET bueno de echo estoy migrando de Visual Basic 6 a Visual Studio 10.

Me encuentro realizando una aplicación que tenia desarrollada en VB6 para actualizar algunos detalles y claro esta esto supone rehacerla prácticamente entera.

Mi primer escollo hasta el momento (ojo que son muchos los cambios pero voy saliendo airoso) es que al conectar el puerto serie y adquirir datos y mostrarlos en un textbox, se me cuelga la aplicación aunque el textbox continua recibiendo pero el formulario me dice que na de na.

Por más vueltas que le doy no encuentro el problema y por más información que encuentro por internet siempre me pasa lo mismo, se cuelga.

Agradezco vuestra ayuda.

Un saludo para todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Javier
Val: 150
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problema con el Puerto Serie

Publicado por Javier (77 intervenciones) el 29/02/2016 00:14:35
nos podrias mostrar la parte del codigo donde tomas la informacion del puerto serie, asi te podriamos ayudar mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema con el Puerto Serie

Publicado por SpiralStudios (8 intervenciones) el 29/02/2016 19:23:49
Hola Javier, gracias por tu interés, ahí va el código.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Public Sub Busca_Puertos()
        MnPuerto.DropDownItems.Clear()
        For Each PuertoSerial As String In My.Computer.Ports.SerialPortNames
            MnPuerto.DropDownItems.Add(PuertoSerial)
        Next
End Sub
 
Private Sub btnConectar_Click(sender As System.Object, e As System.EventArgs) Handles btnConectar.Click
        Call CompPuerto()
 
        If btnConectar.Text = "Conectar" Then
            btnConectar.Text = "Desconectar"
            btnConectar.BackColor = Color.Lime
            TabControl.Enabled = True
            Recibe_Datos()
 
        Else
            btnConectar.Text = "Conectar"
            btnConectar.BackColor = Color.Red
            TabControl.Enabled = False
            Call Cierra_Puerto()
        End If
End Sub
 
Public Sub CompPuerto()
        Call Busca_Puertos()
        If Puerto.IsOpen = False Then
 
            If Puerto.PortName = "COM6" Or MnPuerto.DropDownItems.Count = 0 Then
 
                If MnPuerto.DropDownItems.Count >= 1 Then
                    MsgBox("SELECCIONES PUERTO DE COMUNICACION", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, )
                    Exit Sub
                Else
                    MsgBox("NO HAY PUERTOS DISPONIBLES", MsgBoxStyle.OkOnly, )
                    Exit Sub
                End If
            Else
                Call Abre_Puerto()
            End If
        End If
End Sub
 
Public Sub Abre_Puerto()
 
        '   Puerto = My.Computer.Ports.OpenSerialPort("COM6")
        Puerto.BaudRate = 4800
        Puerto.StopBits = StopBits.One
        Puerto.DataBits = 8
        Puerto.Handshake = Handshake.None
        Puerto.Parity = Parity.None
        Puerto.ReadTimeout = 5000
        Try
            Puerto.Open()
            If Puerto.IsOpen = False Then
                Exit Sub
            Else
                ' Añadir el codigo
 
            End If
        Catch ex As TimeoutException
            MsgBox("Fallo de Comunicacion", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, )
        End Try
End Sub
 
 Public Sub Recibe_Datos()
        Try
            Do
 
                Dim Dato As String = Puerto.ReadLine
                If Dato Is Nothing Then
                    MsgBox("No se reciben datos", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, )
                    Exit Do
                Else
                    '  TextBox1.Text += Dato & vbCrLf
                    clsMonitor.txtMonitor.Text += Dato & vbCrLf
                  '  Application.Run()
                End If
            Loop
        Catch ex As InvalidOperationException
            Exit Sub
        End Try
    End Sub
 
 
Public Sub Cierra_Puerto()
        Puerto.Close()
End Sub

Quizás sea un poco de lio este código por el momento. decirte que en el procedimiento Recibe_Datos si quito el application.run() solo recibo una línea de datos pero el programa no se cuelga, con el application.run() se cuelga pero la ventana de editor continua recibiendo datos.

Gracias por la ayuda Javier, a ver si hay manera.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 481
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problema con el Puerto Serie

Publicado por Miguel (476 intervenciones) el 29/02/2016 23:53:39
Hola,
Creo que la aplicación no responde porque estás usando un "Do ... Loop" infinito (en la función "Recibe_Datos()"). En ésta página puedes ver cómo obtener correctamente los datos.


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier
Val: 150
Ha disminuido 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problema con el Puerto Serie

Publicado por Javier (77 intervenciones) el 01/03/2016 02:16:08
Posiblemente sea lo que comenta Miguel, como recibes informacion o que tipo de informacion recibes? es decir, el equipo que tienes conectado al puerto serial esta enviando informacion constantemente? si no es asi no veo el por que tener ese DO .... LOOP, si solo se envia informacion una vez podrias tomar el valor --- cerrar puerto --- y a la siguiente volver hacer la secuencia, abria que ver la practicidad del codigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema con el Puerto Serie

Publicado por SpiralStudios (8 intervenciones) el 01/03/2016 08:23:35
Gracias Miguel y Javi por la ayuda.

OS comentó, la idea es de recibir datos de un gps, por lo tanto la recepción es continúa hasta que lo desconecte, recuerdo de haber probado un bucle que termine cuando desconecte el gps, volveré a probar.
Bien la información recibida se mostrará en una pantalla monitor o bien se clasificarán por sentencias en una tabla entre otras funciones que tiene la aplicación.
Voy a probar esto que me comentáis y ya OS diré que sucede.
Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problema con el Puerto Serie

Publicado por SpiralStudios (8 intervenciones) el 10/03/2016 20:41:02
Hola Javier y Miguel

Aun continuo con el problema del Puerto y que se me cuelga el programa.
El loop comentaros que no esta configurado sin fin ya que en el caso de que el puerto se cierre sale de este.
He probado a recibir una sola línea, presentarla en un textbox y termina. pues ni así.
Continuo dándole vueltas a esto aunque de momento lo tengo algo aparcado ya que me arreglo leyendo sentencias en un archivo.

Un poco de paciencia que el cambio es grande.
En otro hilo expongo otro problemilla que ya jarte de buscar la solución.

Un saludo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con el Puerto Serie

Publicado por Javier (1 intervención) el 08/09/2022 09:40:32
Hola, a mi me pasó algo parecido y lo solucioné cambiando la instrucción Readline por ReadExisting. Es decir, en tu caso pondría
Dim Dato As String = Puerto.ReadExisting

aunque tendrías que cambiar algo tu código
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Santiago
Val: 17
Ha disminuido su posición en 72 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problema con el Puerto Serie

Publicado por Santiago (27 intervenciones) el 08/09/2022 15:30:39
Hola:

Una práctica bastante buena es poner un "DoEvents" en los bucles For y Do While.

En VB6 era así, tal cual DoEvents.
En VB.NET es Application.DoEvents (creo)

Es la forma de que no se cuelgue el interface gráfico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar