none
I/O operation has been aborted because of either a thread exit or and application request. Serial port vb.net RRS feed

  • Pregunta

  • Tengo una aplicacion de escritorio en vb.net que en formulario abre dos puerto serial que estan conectado a 2 diferente bascula

    El problema que despues de varios entrada y salida del formulario osea open y close de los puertos seriales , me sale el siguiente error I/O operation has been aborted because of either a thread exit or and application request. Serial port vb.nety debo salir total del la aplicacion y comensar denuevo 

    'aqui tengo el codigo

    1.- cuando entra al formulario pregunto esto

     'ESTO SOBRE EL SCALE

        Private ComBuffer As Byte()
        Private ComBuffer2 As Byte()
        Private ComBuffer3 As Byte()

        Private Delegate Sub UpdateFormDelegate()
        Private UpdateFormDelegate1 As UpdateFormDelegate
        Private UpdateFormDelegate2 As UpdateFormDelegate 'Variable para la Puerto Serial 
        Private UpdateFormDelegate3 As UpdateFormDelegate '

        Private INDICADORPUERTO As Integer  '1, 2 ,3 ..Este nos indicar que puerto esta activo

        Dim strReturn As String
        Dim strReturn2 As String
        Dim strReturn3 As String
        Dim strPeso As String
        Dim strPeso2 As String
        Dim strPeso3 As String

        Dim car As String
        Dim car2 As String
        Dim car3 As String

    PRIVATE SUB INICIAR()

    TraeConfiguracion1()

    If Not puertoserial.IsOpen Then
                        OPENPORTSERIAL(0)
                    Else
                        puertoserial.Close()
                        OPENPORTSERIAL(0)
                    End If

     TraeConfiguracion2()

    If Not PuertoSerial2.IsOpen Then
                            OPENPORTSERIAL(1)
                        Else
                            PuertoSerial2.Close()
                            OPENPORTSERIAL(1)
                        End If

    END SUB

    Aqui esta el programa maestro 

                                                                                                                                                                                                                                                                                              
    Private Sub OPENPORTSERIAL(ByVal ind As Integer)
            Try
                Select Case ind
                    Case 0 'Puerto numero 1 
                        If Not puertoserial.IsOpen Then
                            TraeConfiguracion()
                            Try

                                puertoserial.Open()

                            Catch ex As Exception

                                MsgBox("Not Read Scale #1 or Port Serial not exist, (Exist ticket enter Again)" & vbCrLf & _
                                       "No Puede leer la Bascula # 1 Salga del ticket y entre de nuevo al ticket" & "Error 33:" & ex.Message, MsgBoxStyle.Critical)




                            End Try


                        End If
                    Case 1 ' Puerto numero 2
                        If Not PuertoSerial2.IsOpen Then
                            TraeConfiguracion2()
                            Try

                                PuertoSerial2.Open()

                            Catch ex As Exception

                                MsgBox("Don't Reading Scale #2 or Port Serial not exist, (Exist ticket enter Again)" & vbCrLf & _
                                       "No Puede leer la Bascula # 2 Salga del ticket y entre de nuevo al ticket" & vbCrLf & "Error 33:" & ex.Message, MsgBoxStyle.Critical) 

                                         'AQUI ME SALE EL ERROR CUANDO TRATO DE ABRIR EL PUERTO SERIAL


                            End Try

                        End If

                        ' 

                End Select
            Catch ex As Exception

                MessageBox.Show(ex.Message, "Error try open Port")

            End Try

        End Sub

    'Aqui esta el hilo que creamos. 

              
    Private Sub puertoserial_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles puertoserial.DataReceived
            Dim n As Integer = 0
            Try
                UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)



                ' System.Threading.Thread.Sleep(20)



                n = puertoserial.BytesToRead ' capturamos el numero de bytes leidos
                If n > 50 Then
                    ComBuffer = New Byte(n - 1) {} 'redimensionamos
                    puertoserial.Read(ComBuffer, 0, n) 'leemos el dato
                    ' Me.Invoke(UpdateFormDelegate1)
                    BeginInvoke(UpdateFormDelegate1)

                End If
            Catch ex As Exception
                ' MsgBox(ex.Message)
            End Try
        End Sub

        Private Sub UpdateDisplay()
            'variables locales
            Dim incoming As String = ""
            Dim longBuffer As Long = Nothing
            Dim i As Integer = 0

            'calcularmos la longitud del buffer y guardamos la información en una variable
            longBuffer = ComBuffer.Length
            For i = 0 To longBuffer - 1
                incoming = incoming & Chr(ComBuffer(i))
            Next
            strReturn = incoming.ToString

            'ahora solo tenemos que formatear la cadena tal como deseemos.
            'Yo conecte el puerto a una báscula por tanto necesito capturar el dato del pesaje
            '------------------------------------------------
            If strReturn.Length > 2 Then
                i = 0
                strPeso = ""
                Dim blnLeyoNumero As Boolean
                For i = 1 To strReturn.Length
                    car = Mid(strReturn, i, 1)
                    If IsNumeric(car) Or car = "." Then
                        strPeso = strPeso & car
                        blnLeyoNumero = True
                    Else
                        If blnLeyoNumero Then Exit For
                    End If
                Next
            End If
            '--------------------------------------------------
            'Listo ahora el dato lo mostramos en la cajita de texto, ahora si a probarlo
            If INDICADORPUERTO = 1 Then
                If GrossorTarel = 1 Then
                    Me.Gross.Text = strPeso
                Else
                    If GrossorTarel = 2 Then
                        Me.Tarel.Text = strPeso
                    End If
                End If
            End If
        End Sub

      Private Sub PuertoSerial2_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles PuertoSerial2.DataReceived
            'Aqui Vamos a recibir la infomacion de la segunda Bascula 
            Dim n As Integer = 0
            Try
                UpdateFormDelegate2 = New UpdateFormDelegate(AddressOf UpdateDisplay2)



                ' System.Threading.Thread.Sleep(20)



                n = PuertoSerial2.BytesToRead ' capturamos el numero de bytes leidos
                If n > 50 Then
                    ComBuffer2 = New Byte(n - 1) {} 'redimensionamos
                    PuertoSerial2.Read(ComBuffer2, 0, n) 'leemos el dato
                    ' Me.Invoke(UpdateFormDelegate1)
                    BeginInvoke(UpdateFormDelegate2)

                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub


        'Actualiza para para el puerto serial #2
        Private Sub UpdateDisplay2()
            'variables locales
            Dim incoming As String = ""
            Dim longBuffer As Long = Nothing
            Dim i As Integer = 0

            'calcularmos la longitud del buffer y guardamos la información en una variable
            longBuffer = ComBuffer2.Length
            For i = 0 To longBuffer - 1
                incoming = incoming & Chr(ComBuffer2(i))
            Next
            strReturn2 = incoming.ToString

            'ahora solo tenemos que formatear la cadena tal como deseemos.
            'Yo conecte el puerto a una báscula por tanto necesito capturar el dato del pesaje
            '------------------------------------------------
            If strReturn2.Length > 2 Then
                i = 0
                strPeso2 = ""
                Dim blnLeyoNumero As Boolean
                For i = 1 To strReturn2.Length
                    car2 = Mid(strReturn2, i, 1)
                    If IsNumeric(car2) Or car2 = "." Then
                        strPeso2 = strPeso2 & car2
                        blnLeyoNumero = True
                    Else
                        If blnLeyoNumero Then Exit For
                    End If
                Next
            End If
            '--------------------------------------------------
            'Listo ahora el dato lo mostramos en la cajita de texto, ahora si a probarlo

            If INDICADORPUERTO = 2 Then
                If GrossorTarel = 1 Then
                    Me.Gross.Text = strPeso2
                Else
                    If GrossorTarel = 2 Then
                        Me.Tarel.Text = strPeso2
                    End If
                End If
            End If
        End Sub

    'Aqui asigno los valores del los puerto seriales

    Private Sub TraeConfiguracion()
            Try
                puertoserial.PortName = GetKeyPORT()  'puerto de comunicacion
                puertoserial.BaudRate = GetKeyspeedport()   ' velocidad
                puertoserial.DataBits = GetKeyDATABITS()  ' bits  de paridad
                puertoserial.StopBits = Ports.StopBits.One    ' bits de parada
                puertoserial.Parity = Ports.Parity.None

                puertoserial.Handshake = Ports.Handshake.None

            Catch
                MsgBox("Error open de serial", MsgBoxStyle.Critical)
            End Try

        End Sub

     Private Sub TraeConfiguracion2()
            Try
                PuertoSerial2.PortName = GetKeyPORT2()  'puerto de comunicacion
                PuertoSerial2.BaudRate = GetKeyspeedport2()   ' velocidad
                PuertoSerial2.DataBits = GetKeyDATABITS2()  ' bits  de paridad
                PuertoSerial2.StopBits = Ports.StopBits.One    ' bits de parada
                PuertoSerial2.Parity = Ports.Parity.None


                PuertoSerial2.Handshake = Ports.Handshake.None

            Catch
                MsgBox("Error open de serial", MsgBoxStyle.Critical)
            End Try

        End Sub

    'Aqui esta completo todo el codigo y todo se muestra en caja de textbox, LE AGREDECIRIA MUCHO SI PUEDEN AYUDAR DEBO MUCHas semans  HORAs SIN RESULTAdo, vi otros forum que dice que debo actualizar el fremwork 3.5 sp1 ya
    martes, 28 de abril de 2015 13:03

Respuestas

  • HOLA ENCONTRE EL PROBLEMA Y PASA POR UN ERROR DE MICROSOFT SEGUN EL BLOG de este genio

    http://zachsaw.blogspot.com/2010/07/serialport-ioexception-workaround-in-c.html

    Bueno tuve que buscar un convertidor de codigo de  a vb.net auque en otro forum encontre ya convertido en vb.net

    lo meti en una clase luego lo ejecuto ante del puertoserial.open como esto

     SerialPortTester.SerialPortFixer.Execute("com3')
                        puertoserial.Open()

    y asunto solucionado, espero que te sirva tambien y gracias fueste unico que respondio a mi problema

    jueves, 30 de abril de 2015 5:58

Todas las respuestas

  • ¿Dónde cierras los puertos abiertos?

    Debes cerrarlos haciendo esto con todos los puertos :

    If Not PuertoSerial2.IsOpen Then

          PuertoSerial2.DiscardInBuffer()   ' para borrar antes el buffer de entrada
          PuertoSerial2.Close()

    End If


    Saludos, Javier J

    miércoles, 29 de abril de 2015 8:50
  • SI EXACTAMENTE lo que hago para cerralo, al parecer encontre la solution debo espera hasta el dia de hoy. para averguarlo con varias pruebas y te comparto la solution.

    Gracias por responder

    miércoles, 29 de abril de 2015 13:16
  • HOLA ENCONTRE EL PROBLEMA Y PASA POR UN ERROR DE MICROSOFT SEGUN EL BLOG de este genio

    http://zachsaw.blogspot.com/2010/07/serialport-ioexception-workaround-in-c.html

    Bueno tuve que buscar un convertidor de codigo de  a vb.net auque en otro forum encontre ya convertido en vb.net

    lo meti en una clase luego lo ejecuto ante del puertoserial.open como esto

     SerialPortTester.SerialPortFixer.Execute("com3')
                        puertoserial.Open()

    y asunto solucionado, espero que te sirva tambien y gracias fueste unico que respondio a mi problema

    jueves, 30 de abril de 2015 5:58