Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 21 Abril 2016, 15:11 pm



Título: Recibe datos por el puerto serie en modo consola y lo interpreta
Publicado por: Meta en 21 Abril 2016, 15:11 pm
Hola:

Quiero recibir datos por el puerto serie. He hecho varios ejemplos. Lo más sencillo es este código de abajo, solo tiene que mostrar número en la posición que yo quiera X, Y del 0 al 1023 que recibe todo el rato. El código le llega desde Arduino y su código es.

Código Arduino:
Código
  1. int valorPot=0;
  2.  
  3. void setup(){ Serial.begin(115200); }
  4.  
  5. void loop(){
  6.     valorPot=analogRead(2);
  7.     Serial.println(valorPot);
  8.     delay(100); // 0.1 segundos.
  9. }

Código C#:
Código
  1. using System;
  2. using System.IO.Ports; // No olvidar.
  3. using System.Collections.Generic;
  4.  
  5. namespace Porcentaje_Barra_P_Serie_Consola_2_CS
  6. {
  7.    class Program
  8.    {
  9.        public static string Recibidos = "";
  10.  
  11.        // Como variables de clase
  12.        public static string[] Separador = new string[] { ",", "\r", "\n", "/n" };
  13.        public static List<string> Leo_Dato = new List<string>();
  14.  
  15.        static void Main(string[] args)
  16.        {
  17.            Console.Title = "Serial Port C#";
  18.  
  19.            int Variar_este_valor = 0; // De 0 a 1023.
  20.  
  21.            SerialPort Puerto_serie;
  22.  
  23.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  24.            Puerto_serie = new SerialPort();
  25.  
  26.            // Configuración.
  27.            Puerto_serie.PortName = "COM4"; // Número del puerto serie.
  28.            Puerto_serie.BaudRate = 115200; // Baudios.
  29.            Puerto_serie.Parity = Parity.None; // Paridad.
  30.            Puerto_serie.DataBits = 8; // Bits de datos.
  31.            Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
  32.            Puerto_serie.Handshake = Handshake.None; // Control de flujo.
  33.  
  34.            // Establecer la lectura / escritura de los tiempos de espera.
  35.            Puerto_serie.ReadTimeout = 500;
  36.            Puerto_serie.WriteTimeout = 500;
  37.  
  38.            Puerto_serie.Open(); // Abre el puerto serie.
  39.  
  40.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  41.        }
  42.  
  43.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  44.        {
  45.  
  46.            // En el evento.
  47.            Leo_Dato.Clear();
  48.            Leo_Dato.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));
  49.  
  50.            SerialPort sp = (SerialPort)sender;
  51.            Recibidos = sp.ReadLine();
  52.            Console.SetCursorPosition(5, 10); // Posición X, Y.
  53.            Console.Write(Recibidos);
  54.        }
  55.    }
  56. }
  57.  

Cuando varío el potenciómetro de Arduino, en el puerto serie del PC, en pantalla de C# o modo consola, tiene que aparecer valores que lee el programa, la pantalla se apaga rápido.

¿Alguna idea?

Saludos.


Título: Re: Recibe datos por el puerto serie en modo consola y lo interpreta
Publicado por: Eleкtro en 23 Abril 2016, 00:44 am
Por "pantalla" asumo que estás intentando referirte a la consola o shell de Windows, es decir, la CMD.

¿Qué otra cosa esperas que haga un programa al finalizar su ejecución?, cerrarse.

Para evitar un cierre precoz y así poder ver el progreso, puedes iniciar tu programa desde otra instancia de la CMD para que al finalizar su ejecución no se cierre dicha instancia, o bien puedes detener la ejecución de tu aplicación con Console.ReadLine().

Saludos


Título: Re: Recibe datos por el puerto serie en modo consola y lo interpreta
Publicado por: Meta en 23 Abril 2016, 09:41 am
Hola:

He cambiado un poco el código, me mantiene el CMD o consola de C#. Lo que no me funciona es pasar de string que son valores del 0 al 1023 a int. Cada string que me llega del 0 al 1023 cada dos por tres tiene su \n al final, por eso puse un delimitador, para quitar el \n cuando llegue y se quede en un valor, por ejemplo el 587\n al 587, luego tengo que pasarlo del string a int para hacer los cálculos pàsar a voltaje y otro en porcentaje.

Lo que me falta es eso, convertir en string a int y quitar el \n y \r. Supuestamente el \n lo quita, pero da error nada más ejecutar la palicación.
Aquí hay que usar un delimitador, creo que se llama así.
https://msdn.microsoft.com/es-es/library/ms228362.aspx#Anchor_4 (https://msdn.microsoft.com/es-es/library/ms228362.aspx#Anchor_4)

Necesito crear un buendelimitador para quitarlos \n\r cada vez que me llega un dato así.

658\n\r

Debe quedar así:

658

Lo captura en modo string, luego tengo que pasar de string a int.

No me sale.

Saludos.

Saludos.


Título: Re: Recibe datos por el puerto serie en modo consola y lo interpreta
Publicado por: Eleкtro en 23 Abril 2016, 15:49 pm
Es un problema con facil solución:
  • String.TrimEnd(Char[]) | MSDN (https://msdn.microsoft.com/en-us/library/system.string.trimend%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1)

PD: No uses el método por defecto sin parametizar, debes especificar los caracteres adecuados en el array, creo que serían los respectivos códigos Unicode de las constantes Microsoft.VisualBasic.ControlChars.CrLf (o ControlChars.Cr + ControlChars.NewLine):
  • Character literals - C# | MSDN (https://msdn.microsoft.com/en-us/library/aa691087%28v=vs.71%29.aspx)

Saludos


Título: Re: Recibe datos por el puerto serie en modo consola y lo interpreta
Publicado por: Meta en 23 Abril 2016, 17:55 pm
Hola:

Muchas gracias mi muy distinguido amigo.
 Me funciona al 100 %.

Dejo el código por si acaso.
Código
  1. using System;
  2. using System.IO.Ports; // No olvidar.
  3. using System.Collections.Generic;
  4.  
  5. namespace Porcentaje_Barra_P_Serie_Consola_2_CS
  6. {
  7.    class Program
  8.    {
  9.        public static string Recibidos = "";
  10.        public static int Variar_este_valor = 0; // De 0 a 1023.
  11.  
  12.        // public static int numVal = Int32.Parse(Recibidos);
  13.        // public static int numVal = Convert.ToInt32(Recibidos);
  14.  
  15.        public static double Resultado_Porcentaje = 0;
  16.        public static double Resultado_Voltios = 0;
  17.        public static double Mitad_barra = 0;
  18.  
  19.        // Como variables de clase
  20.        public static string[] Separador = new string[] { ",", "\r", "\n", "/n" };
  21.        public static List<string> Leo_Dato = new List<string>();
  22.  
  23.        static void Main(string[] args)
  24.        {
  25.            Console.WindowWidth = 55;
  26.            Console.WindowHeight = 15;
  27.            Console.Title = "Serial Port C#";
  28.  
  29.            SerialPort Puerto_serie;
  30.  
  31.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  32.            Puerto_serie = new SerialPort();
  33.  
  34.            // Configuración.
  35.            Puerto_serie.PortName = "COM4"; // Número del puerto serie.
  36.            Puerto_serie.BaudRate = 115200; // Baudios.
  37.            Puerto_serie.Parity = Parity.None; // Paridad.
  38.            Puerto_serie.DataBits = 8; // Bits de datos.
  39.            Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
  40.            Puerto_serie.Handshake = Handshake.None; // Control de flujo.
  41.  
  42.            // Establecer la lectura / escritura de los tiempos de espera.
  43.            Puerto_serie.ReadTimeout = 500;
  44.            Puerto_serie.WriteTimeout = 500;
  45.  
  46.            Puerto_serie.Open(); // Abre el puerto serie.
  47.  
  48.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  49.  
  50.            Console.Read();
  51.        }
  52.  
  53.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  54.  
  55.        {
  56.  
  57.  
  58.            SerialPort sp = (SerialPort)sender;
  59.            Recibidos = sp.ReadLine();
  60.            Console.Clear();
  61.  
  62.            Recibidos = Recibidos.Replace("\r", "");
  63.  
  64.            int Variar_este_valor = Convert.ToInt32(Recibidos);
  65.  
  66.            // En el evento.
  67.            //Leo_Dato.Clear();
  68.            //Leo_Dato.AddRange(Recibidos.Split(Separador, StringSplitOptions.RemoveEmptyEntries));
  69.  
  70.            Console.WriteLine();
  71.            Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
  72.            Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
  73.            Console.Clear();
  74.            Console.WriteLine("Valor introducido: {0}", Recibidos);
  75.            Console.CursorVisible = false;
  76.  
  77.            // Mostrar barra de porcentaje en pantalla.
  78.            Console.WriteLine();
  79.            Console.WriteLine("0 %                     50 %                   100 %");
  80.            Console.WriteLine("&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;");
  81.            Console.ForegroundColor = ConsoleColor.Yellow;
  82.  
  83.            // Se dibide por dos la barra del porcentaje para que quepa decuadamente en la pantalla.
  84.            Mitad_barra = Resultado_Porcentaje / 2;
  85.  
  86.            if (Mitad_barra > 50)
  87.            {
  88.                Mitad_barra = 50;
  89.            }
  90.  
  91.            for (int i = 1; i <= Mitad_barra; i++)
  92.            {
  93.                Console.Write("&#9608;"); // Muestra ASCII 219 Dec y DB en Hex.
  94.            }
  95.  
  96.            // Si sobre pasa 100, muestra # al final de la barra del porcentaje de color rojo.
  97.            if (Resultado_Porcentaje > 100)
  98.            {
  99.                Console.ForegroundColor = ConsoleColor.Red;
  100.                Console.Write("#");
  101.            }
  102.  
  103.            Console.ForegroundColor = ConsoleColor.Gray; // Vuelve al color gris.
  104.            Console.WriteLine("\n");
  105.            Console.Write("Percentage: " + Resultado_Porcentaje.ToString("N2") + " %.");
  106.            Console.WriteLine();
  107.            Console.Write("Voltage:     " + Resultado_Voltios.ToString("N2") + " V.");
  108.            Console.WriteLine("\n");
  109.  
  110.  
  111.            // Console.Write(Recibidos.PadRight(4));
  112.  
  113.        }
  114.    }
  115. }
  116.  

Saludos.