none
Intentar buscar una solución a este programa. RRS feed

  • Pregunta

  • Hola:

    Hice dos programas de forma manual a la hora de introducir los datos tipo int de 0 al 1023 que funciona de maravilla y el otro los datos tiene que recibirlo por el puerto serie.

    Programa manual que si funciona para que tengan una idea como va:

    using System;
    
    namespace Porcentaje_Barra_Consola_CS
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.Title = "Estilo progressBar C#";
    
                ulong Variar_este_valor = 0; // De 0 a 1023.
                double Resultado_Porcentaje = 0;
                double Resultado_Voltios = 0;
                double Mitad_barra = 0;
    
                Console.WriteLine("Introduce el valor entre 0 al 1023.");
                Console.Write("Introducir: ");
    
                Variar_este_valor = Convert.ToUInt64(Console.ReadLine()); // Entrada de datos por el usuario.
                Console.WriteLine();
                Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
                Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
                Console.Clear(); // Limpia pantalla.
                Console.WriteLine("Valor introducido: {0}", Variar_este_valor);
                Console.CursorVisible = false;
    
                Console.WriteLine();
                Console.WriteLine("0 %                     50 %                   100 %");
                Console.WriteLine("┌────────────────────────┬───────────────────────┐");
                Console.ForegroundColor = ConsoleColor.Yellow;
    
                
                Mitad_barra = Resultado_Porcentaje / 2;
    
                if (Mitad_barra > 50)
                {
                    Mitad_barra = 50;
                }
    
                for (int i = 1; i <= Mitad_barra; i++)
                {
                    Console.Write("█");
                }
    
                if (Resultado_Porcentaje > 100)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("#");
                }
    
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("\n");
                Console.WriteLine("Porcentaje: " + Resultado_Porcentaje.ToString("N2") + " %.");
                Console.WriteLine("Tensión:     " + Resultado_Voltios.ToString("N2") + " V.");
                Console.WriteLine("\n");
                Console.WriteLine("FIN DE PROGRAMA.");
                Console.ReadLine();
            }
    
        }
    }


    Justo abajo el programa que intento hacer funcionar cuando me entra constantemente datos del 0 al 1023 y se me cambia la barra amarilla en tiempo real.

    using System;
    
    using System.IO.Ports; // No olvidar.
    
    namespace Porcentaje_Barra_Puerto_Serie_Consola_CS
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Console.Title = "Puerto serie C#";
    
                string Enviar_datos = "";
                int Variar_este_valor = 0; // De 0 a 1023.
                double Resultado_Porcentaje = 0;
                double Resultado_Voltios = 0;
                double Mitad_barra = 0;
    
                SerialPort Puerto_serie;
    
                // Crear un nuevo objeto SerialPort con la configuración predeterminada.
                Puerto_serie = new SerialPort();
    
                // Configuración.
                Puerto_serie.PortName = "COM4"; // Número del puerto serie.
                Puerto_serie.BaudRate = 115200; // Baudios.
                Puerto_serie.Parity = Parity.None; // Paridad.
                Puerto_serie.DataBits = 8; // Bits de datos.
                Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
                Puerto_serie.Handshake = Handshake.None; // Control de flujo.
    
                // Establecer la lectura / escritura de los tiempos de espera.
                Puerto_serie.ReadTimeout = 500;
                Puerto_serie.WriteTimeout = 500;
    
                Puerto_serie.Open();
    
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                
                while (true)
                {
                    Variar_este_valor = Convert.ToInt32(indata); // Almacena los datos introducidos en consola a la variable.
                    Console.WriteLine(); // Salto de línea.
    
                    Console.WriteLine();
                    Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
                    Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
                    Console.Clear();
                    Console.WriteLine("Valor introducido: {0}", Variar_este_valor);
                    Console.CursorVisible = false;
                    
                    // Mostrar barra de porcentaje en pantalla.
                    Console.WriteLine();
                    Console.WriteLine("0 %                     50 %                   100 %");
                    Console.WriteLine("┌────────────────────────┬───────────────────────┐");
                    Console.ForegroundColor = ConsoleColor.Yellow;
    
                    // Se dibide por dos la barra del porcentaje para que quepa decuadamente en la pantalla.
                    Mitad_barra = Resultado_Porcentaje / 2;
    
                    if (Mitad_barra > 50)
                    {
                        Mitad_barra = 50;
                    }
    
                    for (int i = 1; i <= Mitad_barra; i++)
                    {
                        Console.Write("█"); // Muestra ASCII 219 Dec y DB en Hex.
                    }
    
                    // Si sobre pasa 100, muestra # al final de la barra del porcentaje de color rojo.
                    if (Resultado_Porcentaje > 100)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write("#");
                    }
    
                    Console.ForegroundColor = ConsoleColor.Gray; // Vuelve al color gris.
                    Console.WriteLine("\n");
                    Console.WriteLine("Porcentaje: " + Resultado_Porcentaje.ToString("N2") + " %.");
                    Console.WriteLine("Tensión:     " + Resultado_Voltios.ToString("N2") + " V.");
                    Console.WriteLine("\n");
                    Console.WriteLine("FIN DE PROGRAMA.");
                    Console.ReadLine();
    
                    // Puerto_serie.Close(); // Cerrar puerto serie.
                }
                
            }
    
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
    
                Console.Clear(); // Limpiar pantalla.
                Console.SetCursorPosition(5, 10); // Posición X, Y.
                SerialPort sp = (SerialPort)sender;
                string indata = sp.ReadExisting();
                //Console.WriteLine("Data Received:");
                Console.Write(indata);
            }
        }
    }
    

    Errores que me da:

    Gravedad    Código    Descripción    Proyecto    Archivo    Línea
    Error    CS0103    El nombre 'indata' no existe en el contexto actual    Porcentaje_Barra_Puerto_Serie_Consola_CS    C:\Users\Usuario\Documents\Visual Studio 2015\Projects\Porcentaje_Barra_Puerto_Serie_Consola_CS\Porcentaje_Barra_Puerto_Serie_Consola_CS\Program.cs    44

    ¿Cómo lo soluciono?

    Un cordial saludo.


    http://electronica-pic.blogspot.com

    jueves, 7 de abril de 2016 14:28

Todas las respuestas

  • hola

    es que la variable la estas definiendo en esta linea

    string indata = sp.ReadExisting();

    dentro de DataReceivedHandler, pero luego quieres accederla desde

    Variar_este_valor = Convert.ToInt32(indata);

    dentro del while, pero claro la variable no esta definida de forma global

    deberias llevar la declaracion de la variable a nivel de la clase

    class  Program{
      
    
       private static string indata = "";
    
        static void Main(string[] args)
        {
    	    //resto codigo
    		
    		while(true){
    		
    		    Variar_este_valor = Convert.ToInt32(indata);
    			
    			//resto codigo
    		}
    	}
    	
    	private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    	{
    
    		Console.Clear(); // Limpiar pantalla.
    		Console.SetCursorPosition(5, 10); // Posición X, Y.
    		SerialPort sp = (SerialPort)sender;
    		indata = sp.ReadExisting();
    		//Console.WriteLine("Data Received:");
    		Console.Write(indata);
    	}
    
    }



    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 7 de abril de 2016 14:38
  • Hola:

    Lo hice y me da otro error.


    Ver zoom.

    Saludos.



    • Editado Metaconta jueves, 7 de abril de 2016 14:51
    jueves, 7 de abril de 2016 14:50
  • El error te da porque indata tiene valor vacío. Es bueno controlar esto sustituyendo la linea del error por:

    Dim Variar_este_valor As Int32
    Int32.TryParse(indata, Variar_este_valor)


    Saludos, Javier J

    viernes, 8 de abril de 2016 6:48
  • Hola:

    Me ejecuta el código. DEsde el puerto serie llega valores del 0 al 1023 cada dos por tres. Veo que el refresco en pantalla no me sale bien, hay muchos parpadeos.

    Es en modo consola y muestra una barra de progreso.

    ¿Hay algún truco para hacerlo funcionar bien?

    El código es este.

    using System;
    
    using System.IO.Ports; // No olvidar.
    using System.IO;
    using System.Collections.Generic;
    
    namespace Porcentaje_Barra_Puerto_Serie_Consola_CS
    {
        class Program
        {
            public static string Recibidos = "";
    
                    // Como variables de clase
            public static string[] Separador = new string[] { ",", "\r", "\n", "/n" };
            public static List<string> Leo_Dato = new List<string>();
    
            static void Main(string[] args)
            {
    
                Console.Title = "Serial Port C#";
    
                // string Enviar_datos = "";
                int Variar_este_valor = 0; // De 0 a 1023.
                double Resultado_Porcentaje = 0;
                double Resultado_Voltios = 0;
                double Mitad_barra = 0;
    
                SerialPort Puerto_serie;
    
                // Crear un nuevo objeto SerialPort con la configuración predeterminada.
                Puerto_serie = new SerialPort();
    
                // Configuración.
                Puerto_serie.PortName = "COM4"; // Número del puerto serie.
                Puerto_serie.BaudRate = 115200; // Baudios.
                Puerto_serie.Parity = Parity.None; // Paridad.
                Puerto_serie.DataBits = 8; // Bits de datos.
                Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
                Puerto_serie.Handshake = Handshake.None; // Control de flujo.
    
                // Establecer la lectura / escritura de los tiempos de espera.
                Puerto_serie.ReadTimeout = 500;
                Puerto_serie.WriteTimeout = 500;
    
                try
                {
                    Puerto_serie.Open();
                }
    
                catch (IOException)
                {
                    Console.WriteLine("El puerto " + Puerto_serie.PortName + " no existe.");
                }
    
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                
                while (true)
                {
                    // En el evento
                    Leo_Dato.Clear();
                    Leo_Dato.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));
    
                    if (string.IsNullOrEmpty(Recibidos)) continue;
                    Variar_este_valor = Convert.ToInt32(Recibidos); // Almacena los datos introducidos en consola a la variable.
    
                    Console.WriteLine(); // Salto de línea.
    
                    Console.WriteLine();
                    Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
                    Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
                    Console.Clear();
                    //Console.WriteLine("Valor introducido: {0}", Variar_este_valor);
                    Console.WriteLine("Value entered: {0}", Variar_este_valor);
                    Console.CursorVisible = false;
                    
                    // Mostrar barra de porcentaje en pantalla.
                    Console.WriteLine();
                    Console.WriteLine("0 %                     50 %                   100 %");
                    Console.WriteLine("┌────────────────────────┬───────────────────────┐");
                    Console.ForegroundColor = ConsoleColor.Yellow;
    
                    // Se dibide por dos la barra del porcentaje para que quepa decuadamente en la pantalla.
                    Mitad_barra = Resultado_Porcentaje / 2;
    
                    if (Mitad_barra > 50)
                    {
                        Mitad_barra = 50;
                    }
    
                    for (int i = 1; i <= Mitad_barra; i++)
                    {
                        Console.Write("█"); // Muestra ASCII 219 Dec y DB en Hex.
                    }
    
                    // Si sobre pasa 100, muestra # al final de la barra del porcentaje de color rojo.
                    if (Resultado_Porcentaje > 100)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write("#");
                    }
    
                    Console.ForegroundColor = ConsoleColor.Gray; // Vuelve al color gris.
                    Console.WriteLine("\n");
                    //Console.WriteLine("Porcentaje: " + Resultado_Porcentaje.ToString("N2") + " %.");
                    //Console.WriteLine("Voltaje:     " + Resultado_Voltios.ToString("N2") + " V.");
                    Console.WriteLine("Percentage: " + Resultado_Porcentaje.ToString("N2") + " %.");
                    Console.WriteLine("Voltage:     " + Resultado_Voltios.ToString("N2") + " V.");
                    Console.WriteLine("\n");
                    //Console.WriteLine("FIN DE PROGRAMA.");
                    //Console.ReadLine();
    
                    //Puerto_serie.Close(); // Cerrar puerto serie.
    
                    Console.Clear();
                }
                
            }
    
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
    
                //Console.Clear(); // Limpiar pantalla.
                //Console.SetCursorPosition(5, 10); // Posición X, Y.
                SerialPort sp = (SerialPort)sender;
                Recibidos = sp.ReadLine();
                //Console.WriteLine("Data Received:");
                Console.Write(Recibidos);
            }
        }
    }
    

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 20 de abril de 2016 14:04
  • Parece muy buena idea.

    Puedo quitar el While(true).

    He hecho algún cambio pero me da errores.

    Código completo, aquí abajo.

    using System;
    
    using System.IO.Ports; // No olvidar.
    using System.IO;
    using System.Collections.Generic;
    
    namespace Porcentaje_Barra_Puerto_Serie_Consola_CS
    {
        class Program
        {
            public static string Recibidos = "";
    
                    // Como variables de clase
            public static string[] Separador = new string[] { ",", "\r", "\n", "/n" };
            public static List<string> Leo_Dato = new List<string>();
    
            static void Main(string[] args)
            {
    
                Console.Title = "Serial Port C#";
    
                // string Enviar_datos = "";
                int Variar_este_valor = 0; // De 0 a 1023.
                double Resultado_Porcentaje = 0;
                double Resultado_Voltios = 0;
                double Mitad_barra = 0;
    
                SerialPort Puerto_serie;
    
                // Crear un nuevo objeto SerialPort con la configuración predeterminada.
                Puerto_serie = new SerialPort();
    
                // Configuración.
                Puerto_serie.PortName = "COM4"; // Número del puerto serie.
                Puerto_serie.BaudRate = 115200; // Baudios.
                Puerto_serie.Parity = Parity.None; // Paridad.
                Puerto_serie.DataBits = 8; // Bits de datos.
                Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
                Puerto_serie.Handshake = Handshake.None; // Control de flujo.
    
                // Establecer la lectura / escritura de los tiempos de espera.
                Puerto_serie.ReadTimeout = 500;
                Puerto_serie.WriteTimeout = 500;
    
                try
                {
                    Puerto_serie.Open();
                }
    
                catch (IOException)
                {
                    Console.WriteLine("El puerto " + Puerto_serie.PortName + " no existe.");
                }
    
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                
                    // En el evento
                    Leo_Dato.Clear();
                    Leo_Dato.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));
    
                if (string.IsNullOrEmpty(Recibidos))
                {
                    Variar_este_valor = Convert.ToInt32(Recibidos); // Almacena los datos introducidos en consola a la variable.
                }
                    Console.WriteLine("\n"); // Salto de línea.
    
                    Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
                    Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
                    Console.Clear();
                    //Console.WriteLine("Valor introducido: {0}", Variar_este_valor);
                    Console.Write("Value entered: {0}", Variar_este_valor);
                    Console.CursorVisible = false;
                    
                    // Mostrar barra de porcentaje en pantalla.
                    Console.WriteLine();
                    Console.WriteLine("0 %                     50 %                   100 %");
                    Console.WriteLine("┌────────────────────────┬───────────────────────┐");
                    Console.ForegroundColor = ConsoleColor.Yellow;
    
                    // Se dibide por dos la barra del porcentaje para que quepa decuadamente en la pantalla.
                    Mitad_barra = Resultado_Porcentaje / 2;
    
                    if (Mitad_barra > 50)
                    {
                        Mitad_barra = 50;
                    }
    
                    for (int i = 1; i <= Mitad_barra; i++)
                    {
                        Console.Write("█"); // Muestra ASCII 219 Dec y DB en Hex.
                    }
    
                    // Si sobre pasa 100, muestra # al final de la barra del porcentaje de color rojo.
                    if (Resultado_Porcentaje > 100)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.Write("#");
                    }
    
                    Console.ForegroundColor = ConsoleColor.Gray; // Vuelve al color gris.
                    Console.Write("\n");
                    Console.Write("Percentage: " + Resultado_Porcentaje.ToString("N2") + " %.");
                    Console.Write("Voltage:     " + Resultado_Voltios.ToString("N2") + " V.");
                    Console.Write("\n");
                    Console.Clear();
                
                
            }
    
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
            {
    
                //Console.Clear(); // Limpiar pantalla.
                Console.SetCursorPosition(5, 10); // Posición X, Y.
                SerialPort sp = (SerialPort)sender;
                Recibidos = sp.ReadLine();
                //Console.WriteLine("Data Received:");
                Console.Write(Recibidos);
            }
        }
    }


    http://electronica-pic.blogspot.com

    miércoles, 20 de abril de 2016 14:57