none
Se corta conexión por puerto COM RRS feed

  • Pregunta

  • Hola trabajo con visual C# 2010 express.

    Estoy realizando una pequeña aplicación que me permite recoger información a través de un puerto COM. 

    El equipo que tengo conectado al ordenador a través del bluetooth puerto COM, envia información cada 3 segundo y yo la recojo pero llega cortada, es decir de la línea que envia entera parte se corta y llega por decirlo así en 2 o 3 veces, ¿Por que puede pasar?

    este es el codigo que tengo para recibir datos

    serialPort1.DataReceived += new
                System.IO.Ports.SerialDataReceivedEventHandler(Recepcion);
            }
            //Al recibir los datos
            private void Recepcion(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                //Acumular los carácteres recibidos a nuestro 'buffer' (string) Solo en la primera linea
                Recibidos = serialPort1.ReadExisting();
                //invocar o llamar al proceso de tramas
                this.Invoke(new EventHandler(Actualizar));
            }
            #endregion
            #region Recibe los datos y hace todo el proceso
            //Procesar los datos recibidos en el buffer y extraer tramas completas
            private void Actualizar(object s, EventArgs e)
            //{ }
            //    //Asignar el valor de la trama al textBox de visualizar mensaje 

            //    textBox_visualizar_mensaje.Text = Recibidos;
            { textBox_visualizar_mensaje.Text = Recibidos; 


    Alfonso

    miércoles, 5 de septiembre de 2012 17:01

Todas las respuestas

  • Hola:

    Aquí hay un buen manual sobre el puerto serie con C#.

    Ver manual.

    Saludo.


    http://electronica-pic.blogspot.com

    jueves, 6 de septiembre de 2012 17:43
  • Hola Metaconta,

    Precisamente de tu manual saque el código para conectarme (muchas gracias), yo me conecto a un equipo GPS, la única diferencia que veo entre lo que tu tienes en tu manual y lo que yo puse en el código es el StopBits que tu pones two y yo one.

    Ahora mismo no puedo comprobar la conexión por que no tengo el GPS, pero ¿Podría estar ahi el problema, one o two?

    ¿De que depende poner one o two, supongo que sera de la configuración en mi caso del GPS, no?

    Gracias 

    viernes, 7 de septiembre de 2012 4:14
  • Hola Alfonso,

    Es correcto el comportamiento, pues estas utilizando "ReadExisting" si el GPS no es tan rapido en enviar como tu aplicación en recibir, el efecto es que para una misma trama se dispara el evento de recepción varias veces.

    Te aconsejo que implementes un buffer de recepción o bien utilices la funcion "NewLine" para detectar o leer tramas completas.

    Tambien creo que esta entrada del 2008 en mi Blog, puede ser de utilidad. Recuerda que no todo el codigo que puedes encontrar puede ajustarse a lo que necesitas. Precisamente existen muchas maneras de realizar tareas similares.

    http://msmvps.com/blogs/peplluis/archive/2008/09/16/problemas-en-la-recepci-243-n-de-datos.aspx

    Espero que esto te ayude.
    Saludos,
    PepLluis,


    MVP - Visual Developer

    viernes, 7 de septiembre de 2012 11:47
    Moderador
  • Buenas:

    El GPS debe tener una parte para configurar los baudios, si usa puerto serie por supuesto. Si envías tramas de bytes y recibes, un PC es mucho para un GPS, me refiero el tamaño. Cuando lo logres, puedes hacer lo mismo con algo más pequeño como un PIC.

    Comrpueba la velocidad del GPS, debe estar en las características. Puedes decirnos si lo deseas, qué GPS estás usando, marca y modelo.

    Por cierto, prueba con el HyperTerminal de Windows.

    Pensé quetratabas con temas de movil a control, ejjejeje.

    Ver vídieo

    Un saludo.


    http://electronica-pic.blogspot.com


    • Editado Metaconta lunes, 24 de septiembre de 2012 11:38
    viernes, 7 de septiembre de 2012 19:54
  • Hola,

    El efecto es que para una misma trama se dispara el evento de recepción varias veces, creo que es esto precisamente lo que ocurre.

    El GPS que utilizo es el Topcon Hiper II, recibo una trama NMEA   de este tipo:              $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*24

    Esta trama es igual al iniciar $GPRMC siempre igual, y  al final siempre termina con * ..

    Te aconsejo que implementes un buffer de recepción o bien utilices la funcion "NewLine" para detectar o leer tramas completas, que codigo tengo que poner para leer la trama entera $GPRMC ........................*.., la información que viene después del * no la necesito.

    Deciros que yo solo recibo datos o envio nada al GPS.

    ¿Qué código puedo poner?

    Gracias


    • Editado cutuche martes, 11 de septiembre de 2012 9:02
    martes, 11 de septiembre de 2012 8:59
  • Hola,

    En teoria en "SerialPort.NewLine" debes especificar los caracteres con los que das por concluida la recepción. en tu caso "*", pero debes estar seguro que no recibiras ningun "*" que no signifique fin de linea.

    Por lo tanto deberias trabajar conjuntamente "NewLine" para definir, ReadLine en la funcion asignada en el evento de 'ReceivedData' y posteriormente deberias limpiar el buffer de entrada para descartar los bytes que ya no quieres.

    Si esta explicación no te sirve, hazmelo saber y busco tiempo para simular el escenario.
    Saludos,
    PepLluis,

    jueves, 13 de septiembre de 2012 14:29
  • Hola,

    Con SerialPort.NewLine  le especifico el caracter con el que se concluye "*".

    Necesitaria un SerialPort..... para especificar el caracter con el que se empieza.

    He estado mirando y no veo nada parecido para indicar donde empieza.

    ¿Alguien sabe como decirle donde empieza?

    Gracias

    lunes, 24 de septiembre de 2012 11:33
  • Hola:

    Si entra la información $GPRMC ........................* y después del * no lo necesita. Puedes crear un if else de que si te entra un *, ignora lo demás, te quedas con la trama de bytes recibida.

    El vídeo que indicaba arriba es este.

    http://www.youtube.com/watch?v=QIR_1WLUp7c

    Saludo.


    http://electronica-pic.blogspot.com

    lunes, 24 de septiembre de 2012 11:40
  • Hola:

    DESDE MI IGNORANCIA OS PLANTEO LO QUE CREO QUE PASA

    LA TRAMA: $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*24

    Coloco un : SerialPort.NewLine = "*" para decirle que termina con * (entiendo que mientras no llegue el * el ordenador no pasara la trama a recibidos, es decir el ordenador espera el tiempo necesario hasta que llega *), ¿Esto es así, verdad?

    Entonces cuando empiezo la comunicación la primera vez seria de este tipo (suponiendo que estoy en lo cierto sobre el párrafo anterior, es decir que espera el tiempo que haga falta el ordenador hasta que llega el *): $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*  (Hasta aqui todo bien)

    La siguiente vez que recoge información que transmite el GPS seria así:

    24$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,* (fijaros que ha colocado el 24 al inicio) y yo ese 24 no lo quiero.

    Es por eso que al igual que hay un SerialPort.NewLine para dar el final de la trama, necesitaba un SerialPort.... para darle el inicio en mi caso seria el "$".

    Con esto que os digo no se:

    1º donde colocar el if else, ¿ya que siempre me entrara una trama con *?, por que el ordenador esperara a recibir dicho "*", con lo cual no puedo ignorar lo demás por que no hay mas. (todas las tramas traen "*")

    2º Te aconsejo que implementes un buffer de recepción, me podiaís explicar que es esto de implementar.

    Gracias

    jueves, 27 de septiembre de 2012 8:13
  • Buenas:

    Antes que nada, quiero tener claro una cosa. ¿Te quedas con el * del final de la trama o no?

            string Variable_1 = "$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*"; // Alacenado trama con * al final.
            string Variable_2 = "$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,"; // Si *.

    Haz puesto el 24 delante de la trama. Por lo que veo a parte de un final (*) quieres un inicio (24). Sin embargo, en tu caso es ($).

    Con le HyperTerminal de Windwos o el Minicom de Linux, compruebas bien las tramas recibidas que las puedes leer. Luego te metes con Visual Studio para que las reciba.

    Leyendo arriba otra vez, configura el puerto serie como debe ser po sir acaso.

    Por lo que veo la aplicación que deseas hacer es para queno se cuelgue. Pensé que era para controlar el GPS como quieras.

    Salu2.


    http://electronica-pic.blogspot.com

    jueves, 27 de septiembre de 2012 11:12
  • Hola,

    Antes que nada, quiero tener claro una cosa. ¿Te quedas con el * del final de la trama o no?

    El * viene enviado por el GPS pero no lo necesito para nada.

    Decir que la trama que pongo de ejemplo:

    $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*24 

    - La envia el GPS cada 0,1 segundos.

    - Todos los valores cambian menos....  $GPRMC y *.

    - Decir también que despues del * viene siempre un número (ejemplo 24 o 98 o 76 ....) que no necesito para nada.

    El puerto serie ya lo tengo configurado correctamente.

    Gracias

    jueves, 27 de septiembre de 2012 11:23
  • Hola:

    Sobre la pregunta:

    ¿Te quedas con el * del final de la trama o no?

    Es lo que en realidad quiero preguntarte. Si no necesitas el *, lo ignoras. Eso si. Te quedas con:

    $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,

    Si solamente empieza con $GPRMC y acaba con *, ya te está inficando el inicio y fin de la trama.

    Si después del * no lo necesitas, ignóralo.

    Ahí tienes que comprobar que los datos almacenado en una variable que es la de arriba, compruebe al final que tenga un *. A partir de ahí solo te quedas con:

    $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,

    Supuestamente es lo que deseas.

    ¿Para qué lo quieres exactamente esos datos una vez recibido?

    Voy a investigar.

    Saludo.


    http://electronica-pic.blogspot.com

    jueves, 27 de septiembre de 2012 12:11
  • Hola cutuche,

    Entonces es porque recibes bytes despues de '*' y los encadena con la siguiente trama.

    Tienes dos opciones :

    Ejecutar (al final cada recepcion) :

            SerialPort1.DiscardInBuffer()

    o bien :

            Dim Trama As String = "24$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*"
            Dim PosicionInicio As Integer = Trama.IndexOf("$")
            If PosicionInicio > 1 Then
                Trama = Trama.Substring(PosicionInicio, (Trama.Length - 1) - PosicionInicio)
            End If
    Ya me contaras si te sirve.
    PepLluis,


    MVP - Visual Developer

    jueves, 27 de septiembre de 2012 12:22
    Moderador
  • Hola Señor PepLuis:

    Parece ser que el * tampoco lo quiere.

    Sia caso, sería así:

            Dim Trama As String = "$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,," ' Sin el 24 del principio y *.
            Dim PosicionInicio As Integer = Trama.IndexOf("$")
            If PosicionInicio > 1 Then
                Trama = Trama.Substring(PosicionInicio, (Trama.Length - 1) - PosicionInicio)
            End If


    Saludo.

    Edito:

    Leyendo esta parte, le resta un byte así que de entrada ya no tiene el famoso *.

    (Trama.Length - 1)

    Por lo que se ve, la variable Trama tiene el

    $GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,

    Disculpen el despiste.

    PD: Por cierto. Puedes mostrar el modelo y marca del GPS. Parece un tema muy interesante.
    • Editado Metaconta jueves, 27 de septiembre de 2012 12:36
    jueves, 27 de septiembre de 2012 12:27
  • Con (Trama.Length-1) tiene el '*'

    Con (Trama.Length-2) no tiene el '*'

    :-) asi de simple.

    Saludos,


    MVP - Visual Developer

    jueves, 27 de septiembre de 2012 12:54
    Moderador
  • Buenas de nuevo:

    Él lo quiere así, bajo C# como indicó en el pimer post.

    string Trama = "$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*"; int PosicionInicio = Trama.IndexOf("$"); if (PosicionInicio > 1) { Trama = Trama.Substring(PosicionInicio, (Trama.Length - 1) - PosicionInicio); }

    http://www.developerfusion.com/tools/convert/vb-to-csharp/



    Aquí hice una pregunta pensando que nadie más aparecería por este tema.


    • Editado Metaconta jueves, 27 de septiembre de 2012 14:11
    jueves, 27 de septiembre de 2012 13:30
  • Hola,

    Respondo:

      • ¿Para qué lo quieres exactamente esos datos una vez recibido?

    Solo curioseo pensando en un programa que permita la plantación de vid, sería a groso modo algo asi: Un equipo GPS que recoja la señal y a partir de ahi saber las coordenadas de los puntos donde estoy para marcar un alineación sobre la tierra a plantar las vides y que cada cierta distancia ejemplo 1,5 m una señal (pitido) que indique que esa es la posición de la vid, todo esto en movimiento con un tractor y los aperos adecuados. (Yo no me dedico a ello, tengo otra profesión)

    A falta de probarlo creo que lo tengo.

    Gracias.


    Alfonso


    • Editado cutuche1 viernes, 28 de septiembre de 2012 15:41
    viernes, 28 de septiembre de 2012 14:36
  • Hola:

    Interesante el tema. ¿Ya te funciona el tema?

             var TramaCompleta = "$GPRMC,195651.101,A,3944.8325051,N,00327.084913,W,0.336168,01.40,291204,,*857634843625964364295862349e69563564.";
             var indice = TramaCompleta.IndexOf("*");
             var TramaQueNecesito = TramaCompleta.Substring(0, indice);

    Como curiosidad puedes mostrar capturas de la interfaz.


    http://electronica-pic.blogspot.com

    • Propuesto como respuesta cutuche martes, 9 de octubre de 2012 10:39
    viernes, 28 de septiembre de 2012 17:52
  • Hola:

    Perdonar la ignorancia pero que la interfaz.

    Gracias

    sábado, 29 de septiembre de 2012 6:16
  • Buenas:

    Si sabes lo que es, jejejejejje. En el formulario o Form1 principal, donde introduces objetos como textBox, label, etc, todo ello es una interfaz gráfica.

    Como vez en la imagen, los botones ON y OFF para controlar las salidas del puerto paralelo.

    Tengo hecho otro con el puerto serie, si obtienes todas las órdenes del GPS, puedes hacer con ella lo que quieras, hasta controlar el GPS.

    Saludo.


    http://electronica-pic.blogspot.com

    sábado, 29 de septiembre de 2012 8:17
  • Hola de  nuevo,

    De verdad que no sabía lo que era, soy autodidacta y miro aqui y allí ...

    miércoles, 3 de octubre de 2012 13:43
  • Buenas:

    Veo que está muy de lujo. Puedes añadirle el GDI+ para hacer gráficos vectoriales y saber el rumbo en forma de dibujo.

    Con las coodenadas recibidas, puedes hacer gráficos como si se tratara de caminos.

    Buen trabajo.


    http://electronica-pic.blogspot.com

    jueves, 4 de octubre de 2012 7:54