none
Cerrar puerto serie vb.net 2010 RRS feed

  • Pregunta

  • Hola 

    Gusto de saludarles, estoy teniendo un inconveniente con el cierre de un puerto serie al intentar cerrarlo por intermedio de una clase interna.

    1.- Cuando cierro por evento de botón el puerto cierra sin problemas y abre el otro form dentro del MDI

    2.- Cuando se cierra por código interno por intermedio de una clase privada se queda pegado en serialport1.close()

    Alguna idea o ayuda

    Recibiendo datos del serial port

       Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim s As String = SerialPort1.ReadExisting
            Dim leepuerto As New delegado(AddressOf Me.mostrar)
            Me.Invoke(leepuerto, s)
    
        End Sub
    
        Sub mostrar(ByVal d As String)
            txt_recibe.Text = d
            valida_entrada()
        End Sub

    Clase para cerrar el formulario y abrir otro dentro de MDI

        Private Sub valida_entrada()
            Try
                If txt_recibe.Text = "" Then
                    Exit Sub
                Else
                End If
                SerialPort1.DiscardInBuffer()
                If SerialPort1.ReadExisting Is Nothing Then
                    MsgBox("1")
                Else
                    MsgBox("2") 'Ver si tiene buffer ocupado
                End If
    
                SerialPort1.Close() ' Se queda pegado
                Dim ChildForm As New Frm_entrada
                ChildForm.MdiParent = Me.MdiParent
                ChildForm.Show()
                Me.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
        End Sub

    Evento de botón sin problema al cerrar el form y abrir el otro

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            SerialPort1.Close()
            Dim ChildForm As New Frm_entrada
            ChildForm.MdiParent = Me.MdiParent
            ChildForm.Show()
            Me.Close()
        End Sub

    Configuración del serial port

    Private Sub Setup_Puerto_Serie()
    
            Try
                With SerialPort1
                    If .IsOpen Then
                        .Close()
                    End If
                    .PortName = puertaserie         '// Recibe parametro de archivo de configuración COM8
                    .BaudRate = baudio              '// Recibe parametro de archivo de configuración 9600
                    .DataBits = 8                       '// 8 data bits                                                   
                    .StopBits = IO.Ports.StopBits.One   '// 1 Stop bit 
                    .Parity = IO.Ports.Parity.None      '
                    .DtrEnable = False
                    .Handshake = IO.Ports.Handshake.None
                    .ReadBufferSize = 4096
                    .WriteBufferSize = 1024
                    .ReceivedBytesThreshold = 1
                    .WriteTimeout = 500
                    .Encoding = System.Text.Encoding.Default
                    .Open()                              '  ABRE EL PUERTO SERIE
    
                End With
    
            Catch ex As Exception
                MsgBox("Error al abrir el puerto serial: " & ex.Message, MsgBoxStyle.Critical)
            End Try
        End Sub


    martes, 27 de febrero de 2018 15:08

Respuestas

  • Hola ya lo he solucionado

    en vez de Invoke ocupe BeginInvoke

       Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Dim s As String = SerialPort1.ReadExisting
            Dim leepuerto As New delegado(AddressOf Me.mostrar)
            Me.BeginInvoke(leepuerto, s)
    
        End Sub

    martes, 27 de febrero de 2018 19:03