none
Serialport DataReceived RRS feed

  • Pregunta

  • Hola, buen dia.

     

    Estoy haciendo una aplicacion para recibir datos por medio del puerto serial, ya tengo una aplicacion hecha que funciona correctamente, pero esa aplicacion esta tomando lectura constantemente por medio de seriaPort_DataReceived mientras la aplicacion continua normalmente, pero ahora necesito hacer una aplicacion similar pero esta vez tiene que comenzar la lectura, tomar lectura, detener la lectura, y ademas que la aplicacion se detenga mientras estoy tomando la lectura, una vez terminado, el programa continue normalmente.

    Espero haber explicado bien

     

    Saludos

    lunes, 12 de septiembre de 2011 19:26

Respuestas

  • Hola

    Desde nuestro punto de vista, esta bien, si es 0 es obvio que algo anda mal, pero por experiencia te digo, no desarrollamos para informáticos (quien usa tu software es un usuario común que quizás, por hacer otras cosas no se da cuenta, ademas lo lógico es que se avise), y recuerda que luego eso te va a molestar ;-). Pero ahora me surge la duda, porque va a tener valor 0 si estas esperando la respuesta de la bascula (o seteas a cero siempre que esperas el valor?). 

    A ver no se que mas hace tu programa, pero algo que podrías hacer es:

     

    private void tomaPeso_click(object sender, EventArgs e)
    {
       esperando_Peso=true;
       button2.Enable=false;
    /* etc*/
    }
    
    aunque yo haría una función:

     public void Hab-desh(bool a)
    {
     button2.enable=a;
     button3.Enable=a;
    /*etc...*/
    }

     

     

    private void tomaPeso_click(object sender, EventArgs e)
    {
       esperando_Peso=true;
      Hab-Desh(false);
    }

     

    y en el datareceived, luego de validar que se obtuvieron los datos

    llamo a la funcion: Hab-Desh(true); y digo esperando_Peso=false;

    Sin tener idea de tu diseño, es lo mas simple que se me ocurre. Espero te funcione. Saludos

    ** El código no lo he probado, solo es a manera ilustrativa.

     


    • Editado Cruznick martes, 13 de septiembre de 2011 18:41
    • Marcado como respuesta chente23 martes, 13 de septiembre de 2011 20:10
    martes, 13 de septiembre de 2011 18:39

Todas las respuestas

  • Hola

    Pues la verdad no comprendo muy bien que deseas, podrías poner un ejemplo practico?

    lunes, 12 de septiembre de 2011 20:03
  • El proyecto que ya tengo, lo hago de esta manera:

     

              serialPort = new SerialPort();
    
                if (parametro.PuertoSerie != null && parametro.BaudRate != null && parametro.BitsDatos != null)
                {
                    serialPort = new SerialPort(parametro.PuertoSerie);
                    serialPort.BaudRate = parametro.BaudRate.Value;
                    serialPort.Parity = parametro.Paridad;
                    serialPort.DataBits = parametro.BitsDatos.Value;
                    serialPort.StopBits = parametro.BitParada;
                    serialPort.ReadTimeout = 100;
                    serialPort.Open();
    
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                }
    
    
           void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
    
                this.Invoke(new EventHandler(leer));
    
                var cadena = serialPort.ReadLine();
    
                peso = "";
    
                foreach (char c in cadena)
                {
                    if (char.IsNumber(c))
                        peso += c;
                }
            }
    
            private void leer(object s, EventArgs e)
            {
                    txtPeso.Text = peso;
            }

    Eso esta leyendo el peso de la bascula constantemente, y el usuario captura su informacion mientras esta viendo el peso actual, lo quiero hacer ahora es que no se este leyendo constantemente, lo que quiero es que al presionar un boton comience la lectura del peso y mientras este tomando la lectura, el evento del boton este detenido, ya que termina de leer, se salga del evento del boton.

    Espero haberme explicado esta vez.

    Saludos


    • Editado chente23 martes, 13 de septiembre de 2011 14:49
    lunes, 12 de septiembre de 2011 21:27
  • ¿Nadie tiene idea? o ¿no me he explicado bien?, si me urge un poco lo de este problema, cualquier ayuda se los agradeceria.

     

    saludos

    martes, 13 de septiembre de 2011 16:39
  • Hola

    Disculpa, la demora... me surge una duda por lo que comentas.... la bascula, esta constantemente enviando los datos? Yo manejo varios instrumentos por puerto serie, asi que te puedo dar una mano, lo que pasa es que no acabo de entender el escenario T.T

    Saludos

    martes, 13 de septiembre de 2011 16:42
  • Si,mira, es una bascula grande, para pesar vehiculos, esa manera en la que lo estoy haciendo, el textbox siempre tiene el peso actual que tiene la bascula, desde que inicia el programa creo el serial port, y empieza a correr el metodo de datareceived, y mientras el usuario esta capturando su informacion, el textbox siempre se esta actualizando mostrando el peso que tiene la bascula, ahora, tengo que hacer lo mismo, pero con una bascula mas pequeña, pero quiero tomar la lectura en el momento que yo lo requiera, no en todo momento, por ejempo

    private void tomaPeso_click(object sender, EventArgs e)
    {
        //aqui crear el serialport y el metodo
    
        //aqui tomar el peso actual de la bascula
    
       //aqui dejar de tomar el peso
    
       //aqui poner el peso obtenido en un control
    }
    


    Algo mas o menos asi quiero hacer, pero no tengo idea como.

     

    Saludos

    martes, 13 de septiembre de 2011 16:48
  • y porque no usas una variable de control en el datareceived, si la tienes habilitada, toma la lectura (y pones tu variable de control en falso), sino pues lo descartas(limpias el buffer)... Pero no creo que ese sea tu problema verdad?

    • Editado Cruznick martes, 13 de septiembre de 2011 17:32
    martes, 13 de septiembre de 2011 17:27
  • Esa pudiera ser una opcion, ¿pero como detendria el flujo del programa?, porque le programa no debe de serguir hasta tener el peso, de otra manera el usuario continuaria con su programa antes de obtener el peso.

     

    Saludos

    martes, 13 de septiembre de 2011 17:56
  •  

    Detener flujo del programa? o sea que quieres que quede bloqueado? Que quieres decir conque el programa no debe seguir?

    que mas hace el programa?

    Que quieres evitar que el usuario pueda hacer mientras se esta tomando la medición? (que pasa si por 'algo' la balanza no responde, tu programa= boom!!!) te digo porque yo recibo una trama de 34 caracteres y me comunico con un baudrate de 9600 y es cuestión de milisegundos recibir la respuesta, la diferencia es que yo necesito enviar un comando a mi instrumento, y este me responde.... No crees que te conviene decir, si la variable de control esta activa (o sea estoy recibiendo datos de la medición) pues no te dejo hacer 'Esto'... Ya me dirás y lo vamos viendo....

    pero ten en cuenta que pasa si se desconecta el cable de la balanza... yo utilizo un timer (verifico varias cosas, y si no responde el equipo, le aviso al usuario). 

                               Saludos.

    martes, 13 de septiembre de 2011 18:09
  • Es logico lo que comentas, pero si no hay respuesta desde la bascula, le pondria un 0 de peso, las basculas que yo he usado por ese metodo no ha habido necesidad de enviarle nada, la bascula esta constantemente enviando el peso por el puerto y pues si, es cuestion de milisegundos la lectura de los datos, no se si se presente el caso que se pueda tardar un poco mas en tomar la lectura o mostrarla mi pantalla, entonces lo que intento validar es que el usuario no pueda capturar nada ni moverse por ningun lado, hasta obtener el peso, y como me comentas si no llegase a responder la bascula, pues tendra un valor por default de 0, si es 0 el usuario sabra que algo anda mal con el pesaje.

     

    Saludos

    martes, 13 de septiembre de 2011 18:20
  • Hola

    Desde nuestro punto de vista, esta bien, si es 0 es obvio que algo anda mal, pero por experiencia te digo, no desarrollamos para informáticos (quien usa tu software es un usuario común que quizás, por hacer otras cosas no se da cuenta, ademas lo lógico es que se avise), y recuerda que luego eso te va a molestar ;-). Pero ahora me surge la duda, porque va a tener valor 0 si estas esperando la respuesta de la bascula (o seteas a cero siempre que esperas el valor?). 

    A ver no se que mas hace tu programa, pero algo que podrías hacer es:

     

    private void tomaPeso_click(object sender, EventArgs e)
    {
       esperando_Peso=true;
       button2.Enable=false;
    /* etc*/
    }
    
    aunque yo haría una función:

     public void Hab-desh(bool a)
    {
     button2.enable=a;
     button3.Enable=a;
    /*etc...*/
    }

     

     

    private void tomaPeso_click(object sender, EventArgs e)
    {
       esperando_Peso=true;
      Hab-Desh(false);
    }

     

    y en el datareceived, luego de validar que se obtuvieron los datos

    llamo a la funcion: Hab-Desh(true); y digo esperando_Peso=false;

    Sin tener idea de tu diseño, es lo mas simple que se me ocurre. Espero te funcione. Saludos

    ** El código no lo he probado, solo es a manera ilustrativa.

     


    • Editado Cruznick martes, 13 de septiembre de 2011 18:41
    • Marcado como respuesta chente23 martes, 13 de septiembre de 2011 20:10
    martes, 13 de septiembre de 2011 18:39
  • Eso tambien me podria funcionar, creo que hare algo como eso, pero una pregunta, hay alguna manera de detener el datareceived en algun momento?, porque como te comento, crear el objeto serialport junto con el metodo datareceived, tomare el peso y ya no lo usare, hasta otro momento en donde volvere a crear de nuevo el serialport, etc, sino, pues ignoro la lectura del peso y listo.

     

    Saludos

    martes, 13 de septiembre de 2011 18:49
  • detener el datareceived---> hasta donde yo se no, porque el evento es lanzado con la recepción de datos dependiendo de la propiedad recevedBytesThreshold si es igual a 4 se lanza el evento al recibir 4(cantidad, no valor) en el buffer, supongo que podrias jugar con esto, o cerrar el puerto serie (pero no me gusta). Pregunta: porque no agregaste el serialPort en tiempo de diseño?

    ** en lugar de crearlo, de nuevo como dices " volvere a crear de nuevo el serialport" te conviene cerrar y abrir el puerto y no andar creando obj serialport.

    • Editado Cruznick martes, 13 de septiembre de 2011 19:00
    martes, 13 de septiembre de 2011 18:58
  • Voy a intentar ignorar entonces el peso cuando no lo necesite, respecto a agregarlo en tiempo de diseño, por costumbre, estos controles que no uso confrecuencia los uso asi, igual pude haber agregado el control, ¿hay alguna diferencia?

     

    Saludos

    martes, 13 de septiembre de 2011 19:01
  • No, ninguna... funcionalmente, pero es mas organizado, supongo que cuestión de gustos :-)

    Ahh una cosa seguramente cuando intentas modificar la propiedad Enable de un control desde el datareceived te lance una excepción porque quieres acceder desde un hilo diferente al que lo creo, eso se soluciona utilizando delagados, de todas maneras ahora no estoy seguro que te ocurra, porque no he probado el código.

    martes, 13 de septiembre de 2011 19:13
  • Una pregunta mas, en el sistema que tengo actualmente, al cerrar la aplicacion me marca un error desconocido que hace que se cierre el programa, igual ya se esta cerrando, no tengo idea que es, solo dice que el programa dejode funcionar, lo pruebo en mi equipo y no pasa nada, creo que tiene algo que ver con la lectura de la bascula, ¿hay algo en especial que se tenga que hacer para que se termine sin marcar error?.

     

    Saludos

    martes, 13 de septiembre de 2011 19:25
  • Uhh pero con esos datos que me das es como buscar una aguja en un pajar... intenta poner breackpoints y ver donde falla y si puedes subir una imagen seria de mucha ayuda. Yo por costumbre cierro el puerto si esta abierto:

    seria algo así:

     private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                    if (serialPort1.IsOpen)
                    {
                        serialPort1.DiscardInBuffer();// limpio ambos buffer
                        serialPort1.DiscardOutBuffer();
                        serialPort1.Close();
                    }
            }
    

    pero nada mas, puede que el problema esté en otro lado: Usas hilos en tu aplicación?

     

    • Editado Cruznick martes, 13 de septiembre de 2011 19:31
    martes, 13 de septiembre de 2011 19:31
  • Voy a intentar con eso que pusiste, haber si deja de marcar error, poner una captura de imagen es un poco complicado porque basicamente el lugar de la bascula me queda lejos, lo que hago es que desarrollo lo que debo hacer y mas o menos estructuro el funcionamiento de la bascula, y hasta entonces voy al lugar de donde se encuentra dicha bascula, cuando necesito poner alguna correccion o modificacion, la envio por correo y la instalan :p, y no, no uso hilos, solo el datareceived, solo ese. Si tengo algun otro problema por aqui lo publicare.

    Saludos y gracias por tus sugerencias.

    martes, 13 de septiembre de 2011 20:10
  • No, me refería a una imagen del error cuando uses breackpoints, al cerrar la aplicación.... Saludos
    martes, 13 de septiembre de 2011 20:13
  • Al correr la aplicacion en mi equipo no tiene problemas incluso conectando la bascula a mi equipo, el problema es a la hora de correrla en el equipo conectado a la bascula.

     

    Saludos

    martes, 13 de septiembre de 2011 20:24
  • No me decías que al cerrar la aplicación te daba un mensaje de error? Solo ocurre en el equipo conectado a la bascula? Si es así puede ser que como no cerrabas el puerto, se armaba la desagradable :-) jejeje. Saludos
    martes, 13 de septiembre de 2011 20:44