none
PUERTO SERIE

    Question

  • Hola ! Estoy haciendo una aplicacion para leer los datos desde el puerto serie usando el contol MSCOMM.

    Leo bien los datos, pero el problema que tengo es al querer analizar lo que entra. Ya que al entrar una cadena, mientras extraigo de ella lo que necesito, ingresa una nueva cadena por el puerto y ahi me aparecen los errores. ¿Como puedo solucionar esto?
    Desde ya, Gracias.

    Saturday, August 29, 2009 6:56 PM

Answers

  •  

    Gracias por el aporte, pero ¿podrias explicarme como funciona el invoke?
    ¿ Es algo que actua en segundo plano, y eso permite seguir recibiendo los datos y guardarlos en nuestro buffer ?

    private
    void Recepcion(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

    {

     

    // Acumular los caracteres recibidos a nuestro 'buffer' (string)

    Recibidos +=

    this.serialPort1.ReadExisting();

     

    // Invocar al proceso de tramas

     

    this.Invoke(new EventHandler(Actualizar));

    }

    • Marked as answer by joseIgnacio Tuesday, September 01, 2009 2:15 AM
    Tuesday, September 01, 2009 12:11 AM
  • hola

    Control.Invoke

    basicamentel o que haces es abrir un nuevo hilo utilizando delegados para poder procesar en este caso las tramas que ven llegando.

    o sea esto podrias solucionar tu problemas ya que la primera vez recibe y luego lanza un procso apaerte para seguir procesando lo que llego, no se queda ahi mismo procesando, ya que si lo ahce seguro le pase lo que comentas llegan nueva info del puerto y se complica el procesamiento

    Seria asi, entrada info del puerto que es leido en la linea:

    Recibidos += this.serialPort1.ReadExisting();

    acto seguido lanza un thread (un hilo), para procesar la trama y no bloquear el formulario, y alli es donde procesa la trama en el hilo

    si, acto seguido, mientras aun procesa la trama anterior, llega otro mensaje este estara libre para su recepcion, y lanza otra invocacion en otro hilo.
    asi no genera bloqueos.


    Igual hay algo que no llego a cerrar, resulta que cuandor ecibe simrpe esta haciando uso de la variable "Recibidos", como buffer para ir acumulando lo que recibe del puerto serie, pero no me cierra que cada invoke deba estar usando la misma, o sea se recibe dato y al lanzar el invoke deberia procesar esa trama que se recibe, pero si rapidamente le llega otra por ahi la primera no termino, y la segunda tendra el contenido que la priemra no vacio mas el agregado de la segunda
    jeje si se que es algo rebuscado, no se si lo puede explicar bien, por ahi el Actualizar(), deberia recibir como parametro el texto de la trama que debe procesar, y no usar un buffer comun, ya que si el input desde el puerto series es casi continuo me parece se puede complciar la cosa
    Espero haber interpretado bien.


    me refiero a algo como esto:
    RS232 using thread-safe calls to Windows Forms controls

    como veras aqui eld elegate tiene un parametro de tipo string
    igual el ejemplo es algo rebuscado, ya que intenga hacer seguro la llmada a un control de formulario, entrando la primera vez pero crando luego una invocacion en otro hilo sobre el mismo metodo, pero lo que importa es la diea a cada invoque no habria que pasarle el texto recibido en la lectura del puerto seria ?

    bueno al menos yo me haria esa pregunta, o por ahi una prueba

    espero se entienda la explicacion se que no es simple de escribir en temas the thread.
    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by joseIgnacio Tuesday, September 01, 2009 2:15 AM
    Tuesday, September 01, 2009 12:50 AM

All replies

  • hola

    por alguna razon estas haciendo uso de MSCOMM, digo hay tecnicas mejores, que ese control
    lo usas poruqe has migrado algun codigo? o porque es la unica opcion que ahs encontrado ?


    no se si sabias pero tienes toda una clase para el menejo de este puerto disponible en .net
    SerialPort (Clase)

    Serial Communication using C#


    digo antes de ponerte a pelear con un componente que viene de tecnologia anterior, no te serviria pegarle una mirada a esta nueva libreria ,creo que resultara ams simple de utilizar, mas si estas usando .net , en este caso con C#

    saludo



    saludo

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Saturday, August 29, 2009 8:35 PM
  • Hola JoseIgnacio,

    Aqui tienes un ejemplo practico de como enviar/recibir tramas.
    http://msmvps.com/blogs/peplluis/archive/2007/01/24/componer-las-tramas-recibidas-en-el-puerto-serie-c.aspx

    Saludos,
    Pep Lluis,
    MVP - Visual Developer
    Monday, August 31, 2009 9:43 AM
  •  

    Gracias por el aporte, pero ¿podrias explicarme como funciona el invoke?
    ¿ Es algo que actua en segundo plano, y eso permite seguir recibiendo los datos y guardarlos en nuestro buffer ?

    private
    void Recepcion(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

    {

     

    // Acumular los caracteres recibidos a nuestro 'buffer' (string)

    Recibidos +=

    this.serialPort1.ReadExisting();

     

    // Invocar al proceso de tramas

     

    this.Invoke(new EventHandler(Actualizar));

    }

    • Marked as answer by joseIgnacio Tuesday, September 01, 2009 2:15 AM
    Tuesday, September 01, 2009 12:11 AM
  • hola

    Control.Invoke

    basicamentel o que haces es abrir un nuevo hilo utilizando delegados para poder procesar en este caso las tramas que ven llegando.

    o sea esto podrias solucionar tu problemas ya que la primera vez recibe y luego lanza un procso apaerte para seguir procesando lo que llego, no se queda ahi mismo procesando, ya que si lo ahce seguro le pase lo que comentas llegan nueva info del puerto y se complica el procesamiento

    Seria asi, entrada info del puerto que es leido en la linea:

    Recibidos += this.serialPort1.ReadExisting();

    acto seguido lanza un thread (un hilo), para procesar la trama y no bloquear el formulario, y alli es donde procesa la trama en el hilo

    si, acto seguido, mientras aun procesa la trama anterior, llega otro mensaje este estara libre para su recepcion, y lanza otra invocacion en otro hilo.
    asi no genera bloqueos.


    Igual hay algo que no llego a cerrar, resulta que cuandor ecibe simrpe esta haciando uso de la variable "Recibidos", como buffer para ir acumulando lo que recibe del puerto serie, pero no me cierra que cada invoke deba estar usando la misma, o sea se recibe dato y al lanzar el invoke deberia procesar esa trama que se recibe, pero si rapidamente le llega otra por ahi la primera no termino, y la segunda tendra el contenido que la priemra no vacio mas el agregado de la segunda
    jeje si se que es algo rebuscado, no se si lo puede explicar bien, por ahi el Actualizar(), deberia recibir como parametro el texto de la trama que debe procesar, y no usar un buffer comun, ya que si el input desde el puerto series es casi continuo me parece se puede complciar la cosa
    Espero haber interpretado bien.


    me refiero a algo como esto:
    RS232 using thread-safe calls to Windows Forms controls

    como veras aqui eld elegate tiene un parametro de tipo string
    igual el ejemplo es algo rebuscado, ya que intenga hacer seguro la llmada a un control de formulario, entrando la primera vez pero crando luego una invocacion en otro hilo sobre el mismo metodo, pero lo que importa es la diea a cada invoque no habria que pasarle el texto recibido en la lectura del puerto seria ?

    bueno al menos yo me haria esa pregunta, o por ahi una prueba

    espero se entienda la explicacion se que no es simple de escribir en temas the thread.
    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marked as answer by joseIgnacio Tuesday, September 01, 2009 2:15 AM
    Tuesday, September 01, 2009 12:50 AM