none
comunicación tcp RRS feed

  • Pregunta

  • hola estoy desarrollando un aplicacion en winform de comunicacion tcp con un arduino

    estoy recibiendo los datos de la siguiente forma en el winform

     public static bool Recibir_Comando_Confirmacion(TcpClient cliente)
            {
                bool conf = false;
                byte[] receivedBytes = new byte[50];
                string confirmacion = "*@";
                string datos = "";
                NetworkStream nts = cliente.GetStream();            
                try
                {
                 
                   if(nts.Read(receivedBytes,0,receivedBytes.Length)>0)
                    {
                       datos = Encoding.ASCII.GetString(receivedBytes, 0, 2);
                       datos = datos.ToUpper();
                    
                    }
                    if (datos == confirmacion)
                    {
                        conf = true;
                    }
                }
                catch (Exception) { throw; }            
                return conf;
            }

    Ahora lo idoneo es k la confirmacion siempre llegue de esta forma "*@" y lo que esta pasando es que me llegan caracteres como esto "/r/n*@/r/n" o a veces solamente "/n/r", la pregunta es la siguiente seran que se estan quedando datos en el buffer de entrada o de salida y haya que borrarlos si es asi como lo haria gracias !!


    viernes, 17 de noviembre de 2017 16:53

Respuestas

  • Buenas,

    Si tienes caracteres que nueva línea que no necesitas, y no puedes programar el arduino para no enviarlos (porque sea de un tercero).

    Siempre puedes hacer un replace que te los quite

    Cambia lo que te pongo y nos comentas, así aunque arduino lo envíe, a ti te da igual

    Atte

    datos = datos.ToUpper() ; //por datos = datos.Replace("\n","").Replace("\r","").ToUpper();


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    • Editado Jorge TurradoMVP viernes, 17 de noviembre de 2017 23:10
    • Marcado como respuesta jlpavon1987 sábado, 18 de noviembre de 2017 18:12
    viernes, 17 de noviembre de 2017 23:09

Todas las respuestas

  • hola

    evalua esta implementacion

    arduino-socket-csharp

    veras que usa thread para ir recibiendo los datos del puerto

    en el Form1.cs esta la implementacion, pero la recepcion es asincrona

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 17 de noviembre de 2017 17:16
  • Hola  jlpavon1987

    Con base a tu consulta, te recomiendo implementar el siguiente código, en el cual sirve para la conexión con Arduino.

    //Codigo para conexión de Arduino con C#

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;


    static class Module1
    {
        public static void Main()
        {
            dynamic userRespond = null;
            dynamic fetchedData = null;
            dynamic writeString = null;
            Console.WriteLine("Type R to Read Serial Port.");
            userRespond = Console.ReadLine;
            if (userRespond == "R" | userRespond == "r") {
                System.IO.Ports.SerialPort port = new System.IO.Ports.SerialPort();
                port.PortName = "COM4";
                port.Open();
                port.BaudRate = 9600;
                fetchedData = port.ReadByte;
                Console.WriteLine(fetchedData);
                Console.ReadLine();
            } else {
                Console.WriteLine("Not a Recognized Command.");
            }
        }
    }

    Quedamos al pendiente de cualquier actualización de tu parte.

    Saludos Cordiales.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
    _____
     
    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
     
    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
     
    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 17 de noviembre de 2017 19:17
    Moderador
  • muchas gracias pero estoy utilizando una conexion tcp ip por puerto ethernet

    viernes, 17 de noviembre de 2017 19:27
  • hola Pablo

    le estas recomendando que conecte arduino por puerto serie ? porque entendia que queria comunicarse por placa de red por eso el uso de socket

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de noviembre de 2017 19:29
  • tal ves en principio no tenga nada que ver, pero aquí te dejo de la pagina de Arduino para que lo leas evalúes y ver que tanto provecho le podrías sacar.

    yo lo acabo de implementar para enviar un pulso a un molinete, muy interesante el hardware como el software.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    viernes, 17 de noviembre de 2017 19:31
    Moderador
  • leandro muchas gracias por la publicaion pero el problema es que yo no soy el programador del arduino, pero soy el programador del server  tcp que es en un win form como esta en el ejemplo pero lo que vi es que el se keda esperando una conexion de un cliente con el while(true) al igual que yo pero la diferncia es que cuando al ejemplo se le conecta un cliente el recibe lo que le mande y cierra la conexion a espera de otro cliente yo no yo la dejo abierta ya que en mi caso es un solo cliente y por ahi mismo ambos sistemas nos comunicacmos yo le envio y el me responde. No se si me hago entender y lo que pasa es que me parece que cuando yo le recibo datos a el ya habian restos de datos que s habian kedado de una comunicacion anterior y los recibos como datos de mas en la nueva respuesta... o al menos eso creo k esta pasando. Por eso kiero buscar una manera sin cerrar el socket de limpiar el socket para que no keden datos despues de una respuesta.
    viernes, 17 de noviembre de 2017 19:32
  • hola

    >>pero soy el programador del server  tcp que es en un win form como esta en el ejemplo pero lo que vi es que el se keda esperando una conexion de un cliente con el while(true)

    es justamente lo que comento debes revisar, puede que ese while que mencionas haga toda la diferencia

    podrias descargar el codigo de github y ejecutarlo para que escuche en el puerto al cual envia los datos arduino y ver si los toma correctamente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de noviembre de 2017 19:49
  • Deleted
    viernes, 17 de noviembre de 2017 19:59
  • hola miqui

    y tu respuesta seria? ... porque para criticar sobran personas, pero no veo que estes dando una respuesta concreta, porque se supone que para criticar hay que saber, sino en base a que dices que es mas facil que otra cosa

    >>Es una pregunta trivial, que un programador debiera responder al toque

    de verdad? eso crees

    estamos dando posibles soluciones en base a solo una descripcion escrita, no contamos con el soft que envia los datos para poder probar y dar una mejor respuesta

    hay que ver como es que este funcionando android para enviar los datos, quizas hasta el codigo .net que este usando este correcto y el problema sea de quien envia la informacion, eso no lo sabemos


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 17 de noviembre de 2017 20:23
  • Hola miqui quilmes,

    Te recordamos que estos son foros de colaboración, esto no indica que una persona por dedicarse a la programación pueda resolver un problema en tan solo un instante, el propósito de estos foros es que en forma de comunidad y la participación de varios colaboradores al mismo tiempo se llegue a una "posible" solución.

    Te pedimos de la manera más atenta que si no realizarás algún aporte correspondiente a la consulta evites hacer comentarios que los colaboradores puedan tomar a mal, recuerda que lo que se busca es mejorar el contenido de los foros.

    Ya haz comentado anteriormente en otras consultas levantando quejas de los procesos que se manejan en los foros, te comento(solo para tengas conocimiento en el tema) que después de un cierto tiempo los moderadores debemos marcar una respuesta o lo que más se acerque a la misma, si la persona que está preguntando no regresa o responde después de un número específico de tiempo se debe marcar.

    Gracias por usar los foros de MSDN.

    Juan
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 17 de noviembre de 2017 20:29
    Moderador
  • Buenas,

    Si tienes caracteres que nueva línea que no necesitas, y no puedes programar el arduino para no enviarlos (porque sea de un tercero).

    Siempre puedes hacer un replace que te los quite

    Cambia lo que te pongo y nos comentas, así aunque arduino lo envíe, a ti te da igual

    Atte

    datos = datos.ToUpper() ; //por datos = datos.Replace("\n","").Replace("\r","").ToUpper();


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    • Editado Jorge TurradoMVP viernes, 17 de noviembre de 2017 23:10
    • Marcado como respuesta jlpavon1987 sábado, 18 de noviembre de 2017 18:12
    viernes, 17 de noviembre de 2017 23:09
  • Muchas gracias lo k hice fue un metodo parecido con un split con los caracters /n y /r y asi me kedo con los datos validos lo que todavia tengo dudas es el porque me envia el arduino tantos /r y /n creo que es porque nunca cierro el sockets cuando gestiono la informacion que me da el cliente porque tengo un caso particular y ese que el cliente el arduino en este caso nunca me pregunta primero sino que siempre me da una respuesta a la solicitud que le envio esta un poco mal pensado la configuracion del cliente servidor en este caso pero he tenido que trabajar en base a esa dificultad entonces creo que por eso quedan caracteres como pendientes en el socket ya que en el buffer que recibo los datos del arduino lo declare con un tamaño en consecuinecia a la  cantidad de bytes maxima que recibo como respuesta y no tuve en cuenta los caracteres /r y /n por eso lo que estoy haciendo es un buffer de capaciad mucho mas grande para tratar de recibir todos los datos que me llegan por el sockets

    sábado, 18 de noviembre de 2017 18:13
  • mi amigo me gustaria que me alumbraras con tus conocimientos al respecto que estoy empezando en esto de las comunicaciones con dispositivos y me surgen muchas dudas k a lo mejor tu las tienes muy claras. Aunque no creo que sea esa la forma de expresarse correctamente pero bueno... mi correo es jlpavon1987@gmail.com por si deseas ayudarme me puedes escribir por ahi
    domingo, 19 de noviembre de 2017 0:25