none
Código inalcansable y colocar texto RRS feed

  • Pregunta

  • Buenas:

    Tengo este código qu eenvía texto por el puerto serie. Por ejemplo, me pregunta el programa esto:

    Introduzca un texto:

    Y escribo en el teclado: Led_13_ON

    Como indica abajo, me sale este resultado.

    Si recibe algún dato desde el otro PC, como en este caso, me devulve este mensaje.

    Dato recibido desde Arduino: Led 13 encendido.

    Como muestra arriba, aparece esto: Introduzca un texto: Dato recibido desde Arduino: Led 13 encendido.

    No debe aparecer así. Primero me devuleve este mensaje.

    Dato recibido desde Arduino: Led 13 encendido.

    Luego me tiene que aparecer este otro.

    Introduzca un texto:

    Que es cuando tengo que escribir más mensajes.

    Quiero corregir todo eso. A parte de todo esto.

    Hay un código inalcansable que es al cerrar el puerto serie. Quiero que cuando al cerrar la aplicación desde la ventana, me suelte un mensaje por el puerto serie: Puerto serie cerrado, cierre el puerto, luego se cierra el programa. Para que desde el otro lado del P lo sepa.

    Puerto_serie.Close(); // Cierra el puerto serie.

    Código hecho hasta ahora es este.

    using System;
    using System.IO.Ports;
    
    namespace Introducir_datos_puerto_serie_consola_01
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Título de la ventana.
                Console.Title = "Enviar datos al puerto serie";
    
                // Tamaño de la ventana, x, y.
                Console.SetWindowSize(70, 25);
    
                // Color de fondo.
                Console.BackgroundColor = ConsoleColor.Blue;
    
                // Color de las letras.
                Console.ForegroundColor = ConsoleColor.Yellow;
    
                // Limpiar pantalla y dejarlo todo gris.
                Console.Clear();
    
                // Visible el cursor.
                Console.CursorVisible = true;
    
                // Cree un nuevo objeto SerialPort con la configuración predeterminada.
                SerialPort Puerto_serie = new SerialPort("COM3");
    
                Puerto_serie.BaudRate = 115200;
                Puerto_serie.Parity = Parity.None;
                Puerto_serie.StopBits = StopBits.One;
                Puerto_serie.DataBits = 8;
                Puerto_serie.Handshake = Handshake.None;
                Puerto_serie.RtsEnable = true;
    
                // Establecer los tiempos de espera de lectura / escritura.
                Puerto_serie.ReadTimeout = 500; // Milisegundos.
                Puerto_serie.WriteTimeout = 500;
    
                // Detecta cualquier dato recibido.
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                Puerto_serie.Open(); // Abrir puerto.
    
    
                do
                {
                    Console.Write("Introduzca un texto: ");
                    string texto;
                    texto = Console.ReadLine();
                    Console.WriteLine("El texto introducido es: " + texto);
    
                    //texto = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
                    Puerto_serie.Write(texto); // Envía los datos del string todo su contenido.
                    Console.WriteLine("Comando {0} enviado.", texto); // Muestra en pantalla comandos enviado.
                    Console.WriteLine();
    
                } while (true);
    
                // ################ Aquí me detecta código inaccesible. ################
                Puerto_serie.Close(); // Cierra el puerto serie.
                // #####################################################################
            }
    
            // Detecta cualquier dato entrante.
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
                SerialPort sp = (SerialPort)sender;
                string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
                Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
            }
        }
    }
    

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 29 de julio de 2020 12:06

Todas las respuestas

  • Buenas Señor ElBronto:

    Salir de la aplicación es este comando por lo que encontré en San Google y más allá...

    Environment.Exit(0);

    Debo poner algo así:

    Si pulso X con el ratón
    {
       Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
       Puerto_serie.Close(); // Cierra el puerto serie.
       Environment.Exit(0); // Cerrar aplicación.
    }

    Es lo que quiero hacer, pero no me sale. Un código ejemplo completo donde debe ir si no me equivoco.

    using System;
    using System.IO.Ports;
    
    namespace Introducir_datos_puerto_serie_consola_01
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Título de la ventana.
                Console.Title = "Enviar datos al puerto serie";
    
                // Tamaño de la ventana, x, y.
                Console.SetWindowSize(70, 25);
    
                // Color de fondo.
                Console.BackgroundColor = ConsoleColor.Blue;
    
                // Color de las letras.
                Console.ForegroundColor = ConsoleColor.Yellow;
    
                // Limpiar pantalla y dejarlo todo gris.
                Console.Clear();
    
                // Visible el cursor.
                Console.CursorVisible = true;
    
                // Cree un nuevo objeto SerialPort con la configuración predeterminada.
                SerialPort Puerto_serie = new SerialPort("COM3");
    
                Puerto_serie.BaudRate = 115200;
                Puerto_serie.Parity = Parity.None;
                Puerto_serie.StopBits = StopBits.One;
                Puerto_serie.DataBits = 8;
                Puerto_serie.Handshake = Handshake.None;
                Puerto_serie.RtsEnable = true;
    
                // Establecer los tiempos de espera de lectura / escritura.
                Puerto_serie.ReadTimeout = 500; // Milisegundos.
                Puerto_serie.WriteTimeout = 500;
    
                // Detecta cualquier dato recibido.
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                Puerto_serie.Open(); // Abrir puerto.
    
                //Console.CursorSize = 1;
    
                do
                {
                    Console.Write("Introduzca un texto: ");
                    string texto;
                    texto = Console.ReadLine();
                    Console.WriteLine("El texto introducido es: " + texto);
    
                    //texto = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
                    Puerto_serie.Write(texto); // Envía los datos del string todo su contenido.
                    Console.WriteLine("Comando {0} enviado.", texto); // Muestra en pantalla comandos enviado.
                    Console.WriteLine();
    
                    // ################ No me sale el if como debe ser. ################
                    //            Si pulso X con el ratón
                    //            {
                    //                Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
                    //                Puerto_serie.Close(); // Cierra el puerto serie.
                    //                Environment.Exit(0); // Cerrar aplicación.
                    //            }
                    // #####################################################################
    
                } while (true);
    
    
            }
    
            // Detecta cualquier dato entrante.
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
                SerialPort sp = (SerialPort)sender;
                string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
                Console.WriteLine("Datos recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
            }
        }
    }

    Espeero que se entienda.

    Saludos.



    http://electronica-pic.blogspot.com



    • Editado Metaconta miércoles, 29 de julio de 2020 15:04
    miércoles, 29 de julio de 2020 14:59
  • ¿No te da problemas el are?

    Gravedad    Código    Descripción    Proyecto    Archivo    Línea    Origen    Estado suprimido
    Error    CS0103    El nombre 'are' no existe en el contexto actual    Introducir_datos_puerto_serie_consola_01    C:\Users\Usuario\Documents\Visual Studio 2019\Projects\Introducir_datos_puerto_serie_consola_01\Introducir_datos_puerto_serie_consola_01\Program.cs    61    IntelliSense    Activo

    Código completo.

    using System;
    using System.IO.Ports;
    using System.Threading;
    
    namespace Introducir_datos_puerto_serie_consola_01
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Título de la ventana.
                Console.Title = "Enviar datos al puerto serie";
    
                // Tamaño de la ventana, x, y.
                Console.SetWindowSize(70, 25);
    
                // Color de fondo.
                Console.BackgroundColor = ConsoleColor.Blue;
    
                // Color de las letras.
                Console.ForegroundColor = ConsoleColor.Yellow;
    
                // Limpiar pantalla y dejarlo todo gris.
                Console.Clear();
    
                // Visible el cursor.
                Console.CursorVisible = true;
    
                // Cree un nuevo objeto SerialPort con la configuración predeterminada.
                SerialPort Puerto_serie = new SerialPort("COM3");
    
                Puerto_serie.BaudRate = 115200;
                Puerto_serie.Parity = Parity.None;
                Puerto_serie.StopBits = StopBits.One;
                Puerto_serie.DataBits = 8;
                Puerto_serie.Handshake = Handshake.None;
                Puerto_serie.RtsEnable = true;
    
                // Establecer los tiempos de espera de lectura / escritura.
                Puerto_serie.ReadTimeout = 500; // Milisegundos.
                Puerto_serie.WriteTimeout = 500;
    
                // Detecta cualquier dato recibido.
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                Puerto_serie.Open(); // Abrir puerto.
    
                // lo creamos señalizado así pasa cuando entra al do por primera vez
                are = new AutoResetEvent(true);
    
                do
                {
                    // la función espera por la señal para retornar
                    // y se autorresetea para quedar en modo de espera nuevamente
                    are.WaitOne();
    
                    Console.Write("Introduzca un texto: ");
                    string texto;
                    texto = Console.ReadLine();
                    if (texto.ToUpper() == "X") break;
                    Console.WriteLine("El texto introducido es: " + texto);
    
                    //texto = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
                    Puerto_serie.Write(texto); // Envía los datos del string todo su contenido.
                    Console.WriteLine("Comando {0} enviado.", texto); // Muestra en pantalla comandos enviado.
                    Console.WriteLine();
    
                    // ################ Pregunta aquí si quieres salir.   ################
                                //Si pulso X con el ratón
                                //{
                                //    Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
                                //    Puerto_serie.Close(); // Cierra el puerto serie.
                                //    Environment.Exit(0); // Cerrar aplicación.
                                //}
                    // #####################################################################
    
                } while (true);
    
    
            }
    
            // Detecta cualquier dato entrante.
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
                SerialPort sp = (SerialPort)sender;
                string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
                Console.WriteLine("Datos recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
    
                // señalizamos el evento para que el do continúe
                are.Set();
            }
        }
    }
    


    http://electronica-pic.blogspot.com

    miércoles, 29 de julio de 2020 17:30
  • Hola:

    En Windows Form se usa esto.

     // Detecta cualquier dato recibido.
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    

    Ya que al parecer, no gusta esta forma a la gente por lo que veo ni en modo consola, pues usar otra cosa.

    using System;
    using System.IO.Ports;
    using System.Threading;
    
    namespace Introducir_datos_puerto_serie_consola_02
    {
        class Program
        {
            static bool _continue;
            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
            static SerialPort Puerto_serie = new SerialPort("COM3");
    
            static void Main(string[] args)
            {
                string name;
                string message;
                StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
                Thread readThread = new Thread(Read);
    
                // Título de la ventana.
                Console.Title = "Enviar datos al puerto serie";
    
                // Tamaño de la ventana, x, y.
                Console.SetWindowSize(70, 25);
    
                // Color de fondo.
                Console.BackgroundColor = ConsoleColor.Blue;
    
                // Color de las letras.
                Console.ForegroundColor = ConsoleColor.Yellow;
    
                // Limpiar pantalla y dejarlo todo gris.
                Console.Clear();
    
                // Visible el cursor.
                Console.CursorVisible = true;
    
                Puerto_serie.BaudRate = 115200;
                Puerto_serie.Parity = Parity.None;
                Puerto_serie.StopBits = StopBits.One;
                Puerto_serie.DataBits = 8;
                Puerto_serie.Handshake = Handshake.None;
                Puerto_serie.RtsEnable = true;
    
                // Establecer los tiempos de espera de lectura / escritura.
                Puerto_serie.ReadTimeout = 500; // 500 // Milisegundos.
                Puerto_serie.WriteTimeout = 500; // 500
    
                Puerto_serie.Open();
                _continue = true;
                readThread.Start();
    
                Console.Write("Nombre: ");
                name = Console.ReadLine();
    
                Console.WriteLine("Type QUIT to exit");
    
                while (_continue)
                {
                    message = Console.ReadLine();
    
                    if (stringComparer.Equals("quit", message))
                    {
                        _continue = false;
                    }
                    else
                    {
                        Puerto_serie.WriteLine(
                            String.Format("<{0}>: {1}", name, message));
                    }
                }
    
                readThread.Join();
                Puerto_serie.Close();
    
            }
    
            public static void Read()
            {
                while (_continue)
                {
                    try
                    {
                        string message = Puerto_serie.ReadLine();
                        Console.WriteLine(message);
                    }
                    catch (TimeoutException) { }
                }
            }
        }
    }
    

    En este código, se me he dado cuenta que por fin, me responde bien la entrada de datos y no hace cosas raras.

    Gracias.


    http://electronica-pic.blogspot.com

    miércoles, 5 de agosto de 2020 1:57