elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Recibe datos por el puerto serie en modo consola y lo interpreta
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recibe datos por el puerto serie en modo consola y lo interpreta  (Leído 3,060 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Recibe datos por el puerto serie en modo consola y lo interpreta
« 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.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Recibe datos por el puerto serie en modo consola y lo interpreta
« Respuesta #1 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


« Última modificación: 23 Abril 2016, 00:50 am por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Recibe datos por el puerto serie en modo consola y lo interpreta
« Respuesta #2 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

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.
« Última modificación: 23 Abril 2016, 14:13 pm por Meta » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Recibe datos por el puerto serie en modo consola y lo interpreta
« Respuesta #3 en: 23 Abril 2016, 15:49 pm »

Es un problema con facil solución:

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):

Saludos
« Última modificación: 23 Abril 2016, 15:59 pm por Eleкtro » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Recibe datos por el puerto serie en modo consola y lo interpreta
« Respuesta #4 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recibir datos del puerto serie en bytes.
.NET (C#, VB.NET, ASP)
Meta 2 6,916 Último mensaje 29 Octubre 2008, 23:24 pm
por Meta
Descifrar o decodificar datos de puerto serie
Ingeniería Inversa
jesmasuso 7 5,864 Último mensaje 12 Diciembre 2014, 09:50 am
por MCKSys Argentina
Recibir datos desde el puerto serie
Programación Visual Basic
Meta 2 2,538 Último mensaje 3 Junio 2015, 21:07 pm
por Meta
recibir los datos de un puerto serie y actulizarlo en una label
Programación Visual Basic
cael1011 3 2,659 Último mensaje 7 Agosto 2015, 13:26 pm
por 79137913
[TUTORIAL] Arduino Consola y puerto serie
Electrónica
Meta 0 6,028 Último mensaje 15 Agosto 2017, 12:11 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines