none
Raro error utilizando SerialPort RRS feed

  • Pregunta

  • Hola! consegui recibir datos desde un lector de codigos de barras bluetooth en mi pocket pc con winmobile 5. Pero, siempre hay un pero me pasó esto...(con vs2005 professional)

    Tengo en un proyecto simple de prueba, un textbox un serialport y un boton, con el boton abro el puerto, leo con el lector, envia los datos y en el evento de recepcion asigno esos datos con "ReadExisting" en una variable "s" y funciona perfecto, pero cuando a esa variable la intento copiar al textbox, me da error "indefinido", incluso probe sin leer datos en ese evento e intentar poner una dato vacio("") al textbox y tambien da error.

    La solución fue definir una variable global y asgignarle el valor leido a esa variable y desde un boton asignar al textbox y ahi si funciona.

    Resumen: dentro del evento "DataReceived" del SerialPort no puedo escribir un textbox!!! porque????

     

    Copio error:

    +  TextBox1    {Text = Excepción de tipo: '{System.NotSupportedException}'.}    System.Windows.Forms.TextBox
    +  TextBox1.Text    {"No se puede mostrar un mensaje de error porque no se pudo encontrar un ensamblado de recursos opcional que lo contiene"}    String
    s    "77912732"    String
    +   sp    {System.IO.Ports.SerialPort}    System.IO.Ports.SerialPort

     

    copio codigo proyecto:

    Imports System.IO.Ports
    Public Class Form1
        Dim s As String
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If sp.IsOpen Then
                sp.Close()
                Label1.Text = "Cerrado"
            Else
                sp.Open()
                Label1.Text = "Abierto"
            End If
            TextBox1.Text = ""
        End Sub

        Private Sub sp_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
            Try
                s = sp.ReadExisting
                'TextBox1.Text = "" 'si destildo esto, da error
                'TextBox1.Text = s 'si destildo esto, da error
            Catch
                MsgBox("error")
            End Try
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            TextBox1.Text += s
        End Sub
    End Class


    Carlos
    viernes, 29 de julio de 2011 15:28

Respuestas

  • Nunca vencido ni aun vencido!!!

     

    Hola Roberto, pues que no hay caracteres raros ni nada! Parece ser un error conocido del evento. Continue buscando y encontre algo que lo probe y ahi si funciona

    http://www.netframeworkdev.com/net-base-class-library/serialport-datareceived-13608.shtml

    Public Delegate Sub StringSubPointer(ByVal Buffer As String) ' Define a delegate to transfer the received string

    Private Sub Receiver(ByVal sender As Object, Byval e As SerialDataReceivedEventArgs) Handles YourSerialPort.DataReceived
    Dim RxString As String = YourSerialPort.ReadLine
    Me.BeginInvoke(New StringSubPointer(AddressOf Display), RxString) ' Marshal the call to the UI thread
    End Sub

    Private Sub Display(ByVal buffer As string) ' Your display routine

    YourTextBox.AppendText(Buffer)

    End Sub

    Saludos y gracias

     

     


    Carlos
    • Marcado como respuesta CHAR72 lunes, 1 de agosto de 2011 22:46
    lunes, 1 de agosto de 2011 22:45

Todas las respuestas

  • Buenos dias Carlos,

     

    Pues hay algunos tipos de errores que son visibles en WM, sin embargo prueba de la siguiente manera a ver si resuelve tu error:

    TextBox1.Text = "" & s

    Una de las cosas que he podido darme cuenta es que si viene una dato nulo o on un valor que no es valido y lo asignamos directamente al textbox nos da error, pero si ante colocamos la cadena de longitud cero no da el error pues el primer caracter lo asume como valido a pesar de ser de longitud cero.

     

    Saludos,


    Roberto Alvarado Taborda www.bogotadotnet.org Core Group BogotaDotNET Mobile Developer .NET Bogota - Colombia
    sábado, 30 de julio de 2011 12:44
  • Hola Roberto!

    Te comento que no funcionó tu propuesta. Ademas, estoy seguro que no es un problema de valores nullos, pues como puse, la variable "s" tiene un valor, que es el codigo enviado!

    Para exponenciar mi sorpresa, no pude resolver directamente el problema, porque ademas, quite la signación de la variable y en cambio llamo a un "sub" con esa variable de parametro y TAMBIEN DA ERROR!

    Resolví (hasta que SAN PEDRO o el demonio diga algo) asignando lo que envia el lector a una variable global y activando un "timer" que llama al procedure con el valor leido y luego vacio la variable. UNA CHORRADA como dirian los españoles!

    POR ESTO NO DEJO VB6!

    Saludos

    Carlos


    Carlos
    lunes, 1 de agosto de 2011 15:31
  • Hola Carlos,

     

    Alli el tema es que hay algo que es un error, no se puede asignar a una variable de tipo string en .net, es posible que loq ue recibes sean caracteres especiales y de alli sea el motivo del error.

     

    Con respecto a VB6, si fue bueno en su momento, pero ahora prefiero desarrollar en plataforma .NET, esa es mi humilde opinion.

     

    Saludos,

     


    Roberto Alvarado Taborda www.bogotadotnet.org Core Group BogotaDotNET Mobile Developer .NET Bogota - Colombia
    lunes, 1 de agosto de 2011 17:06
  • Nunca vencido ni aun vencido!!!

     

    Hola Roberto, pues que no hay caracteres raros ni nada! Parece ser un error conocido del evento. Continue buscando y encontre algo que lo probe y ahi si funciona

    http://www.netframeworkdev.com/net-base-class-library/serialport-datareceived-13608.shtml

    Public Delegate Sub StringSubPointer(ByVal Buffer As String) ' Define a delegate to transfer the received string

    Private Sub Receiver(ByVal sender As Object, Byval e As SerialDataReceivedEventArgs) Handles YourSerialPort.DataReceived
    Dim RxString As String = YourSerialPort.ReadLine
    Me.BeginInvoke(New StringSubPointer(AddressOf Display), RxString) ' Marshal the call to the UI thread
    End Sub

    Private Sub Display(ByVal buffer As string) ' Your display routine

    YourTextBox.AppendText(Buffer)

    End Sub

    Saludos y gracias

     

     


    Carlos
    • Marcado como respuesta CHAR72 lunes, 1 de agosto de 2011 22:46
    lunes, 1 de agosto de 2011 22:45