Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 11 Diciembre 2015, 12:19 pm



Título: Mejorar este código
Publicado por: Meta en 11 Diciembre 2015, 12:19 pm
Hola:

Antes que nada, ya que es modo consola, lo pongo en español bien español.

Enviar datos:

1. Configuración del puerto serie.

2. Abrir puerto.

3. La consola espera que introduza datos.

4. Al introducir datos, lo guarda en una variable string, da igual lo que escribas, letras, números o símbolos.

5. Si pulsas Enter envía datos al puerto serie.

Recibir datos:

1. La Consola está en espera de recibir algún dato.

2. Lo guarda en una variable string.

3. La Consola muestra en pantalla los datos recibidos.

4. Si cierra la consola o palicación, cierra el puerto.

El código de enviar datos que he hecho paso a paso es este.

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using System.IO.Ports; // No olvidar.
  8. using System.Threading;
  9.  
  10. namespace Puerto_serie_consola_CS
  11. {
  12.    class Program
  13.    {
  14.        static void Main(string[] args)
  15.        {
  16.            Console.Title = "Puerto serie C#";
  17.  
  18.            string Enviar_datos = "";
  19.  
  20.            SerialPort Puerto_serie;
  21.  
  22.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  23.            Puerto_serie = new SerialPort();
  24.  
  25.            // Configuración.
  26.            Puerto_serie.PortName = "COM4"; // Número del puerto serie.
  27.            Puerto_serie.BaudRate = 115200; // Baudios.
  28.            Puerto_serie.Parity = Parity.None; // Paridad.
  29.            Puerto_serie.DataBits = 8; // Bits de datos.
  30.            Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
  31.            Puerto_serie.Handshake = Handshake.None; // Control de flujo.
  32.  
  33.            // Establecer la lectura / escritura de los tiempos de espera.
  34.            Puerto_serie.ReadTimeout = 500;
  35.            Puerto_serie.WriteTimeout = 500;
  36.  
  37.            while (true)
  38.            {
  39.                Console.WriteLine("Introduce comandos:"); // Muestra texto en pantalla.
  40.                Enviar_datos = Console.ReadLine(); // Almacena los datos introducidos en consola a la variable.
  41.  
  42.                switch (Enviar_datos)
  43.                {
  44.                    case "Led_ON":
  45.                        Puerto_serie.Open(); // Abrir puerto serie.
  46.                        byte[] miBuffer = Encoding.ASCII.GetBytes(Enviar_datos); // Guarda un array los datos y codificado en ASCII.
  47.                        Puerto_serie.Write(miBuffer, 0, miBuffer.Length); // Envía al puerto el array almacenado del buffer.
  48.                        Console.WriteLine(); // Salto de línea.
  49.  
  50.                        //Puerto_serie.Write(Enviar_datos); // Con solo esta línea también vale pero no está codificado.
  51.  
  52.                        Puerto_serie.Close(); // Cerrar puerto serie.
  53.                        break;
  54.  
  55.                    case "Led_OFF":
  56.                        Puerto_serie.Open(); // Abrir puerto serie.
  57.                        byte[] miBuffer2 = Encoding.ASCII.GetBytes(Enviar_datos); // Guarda un array los datos y codificado en ASCII.
  58.                        Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length); // Envía al puerto el array almacenado del buffer.
  59.                        Console.WriteLine(); // Salto de línea.
  60.  
  61.                        //Puerto_serie.Write(Enviar_datos); // Con solo esta línea también vale pero no está codificado.
  62.  
  63.                        Puerto_serie.Close(); // Cerrar puerto serie.
  64.                        break;
  65.                }
  66.            }
  67.        }
  68.    }
  69. }

Este código de enviar datos lo he probado en Arduino, funciona de maravilla. Antes de continuar con la parte de recibir datos, quiero saber si la forma que lo he programado es suficiente o lo tengo al estilo chapuza. Si alguien sabe mejorarlo de mejor manera, mejor que mejor.

Luego me centro en la parte de enviar datos.

Un cordial salduo.


Título: Re: Mejorar este código
Publicado por: kub0x en 12 Diciembre 2015, 21:56 pm
Hola Meta,

no está mal, te dejo una versión simplificada y te comento los cambios:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using System.IO.Ports; // No olvidar.
  8. using System.Threading;
  9.  
  10. namespace Puerto_serie_consola_CS
  11. {
  12.        static void Main(string[] args)
  13.        {
  14.            Console.Title = "Puerto serie C#";
  15.  
  16.            //Los parametros de la config los he puesto en la constructora veáse https://msdn.microsoft.com/en-us/library/z8d1ykfs%28v=vs.100%29.aspx
  17.            SerialPort Puerto_serie = new SerialPort("COM4", 115200, Parity.None, 8, StopBits.Two);
  18.  
  19.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  20.            Puerto_serie = new SerialPort();
  21.  
  22.            // Configuración.
  23.            Puerto_serie.Handshake = Handshake.None; // Control de flujo.
  24.  
  25.            // Establecer la lectura / escritura de los tiempos de espera.
  26.            Puerto_serie.ReadTimeout = 500;
  27.            Puerto_serie.WriteTimeout = 500;
  28.  
  29.            string  Enviar_datos = String.Empty;
  30.  
  31.            while (true)
  32.            {
  33.                Console.WriteLine("Introduce comandos:"); // Muestra texto en pantalla.
  34.                Enviar_datos = Console.ReadLine();
  35.                byte[] buff = Encoding.ASCII.GetBytes(Enviar_datos); // Guarda un array los datos y codificado en ASCII.
  36.                Puerto_serie.Open();
  37.                Puerto_serie.Write(buff, 0, buff.Length); // Envía al puerto el array almacenado del buffer.
  38.                Console.WriteLine(); // Salto de línea.
  39.                Puerto_serie.Close(); // Cerrar puerto serie.
  40.            }
  41.        }
  42.    }
  43. }

He quitado la claúsula switch(){} pues en ambos cases hacías las mismas llamadas empleando los mismos objetos. No lo he probado pero espero te funcione.

Saludos!