Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] [C#] Cortar por lo sano

Estas en el tema de [C#] Cortar por lo sano en el foro de .NET en Foros del Web. Hola: Tengo este código hecho en C#. Código: switch (comando) { case "1=ON": pictureBox1.Image = Properties.Resources.Led_rojo_encendido; Recibidos = ""; break; case "1=OFF": pictureBox1.Image = Properties.Resources.Led_rojo_apagado; ...
  #1 (permalink)  
Antiguo 03/12/2015, 17:25
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 10 meses
Puntos: 8
[C#] Cortar por lo sano

Hola:

Tengo este código hecho en C#.
Código:
                switch (comando)
                {
                    case "1=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "1=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "2=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "2=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "3=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "3=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "4=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "4=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;
                }
En una variable recibidos me llega todo junto esta cadena de carácteres.

1=ON 2=ON 3=OFF 4=OFF

Como está todo junto, no consigo ni mirando aquí la solución para que me detecte algún case.

¿Alguna idea?

Un cordial saludo.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #2 (permalink)  
Antiguo 03/12/2015, 19:11
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 2 meses
Puntos: 52
Respuesta: [C#] Cortar por lo sano

No entiendo para qué semejante switch si solo estás usando 2 posibles imagenes?

Además, como decís que te viene todo junto pero estás modificando solo 1 PictureBox? tu código y tu explicación no tienen mucho sentido, la verdad.

Más detalles?
  #3 (permalink)  
Antiguo 03/12/2015, 19:58
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 10 meses
Puntos: 8
Respuesta: [C#] Cortar por lo sano

Hola:

Deja ver si me expreso mejor.

Hice una interfaz.


Donde pone Mensajes desde Arduino: Como vez en la imagen no le hagas caso, ahora pone:

1=ON 2=ON 3=OFF 4=OFF

En la variable Recibidos me sale toda esa cadena y no puedo entrar en el switch porque debo partirlo y no se como hacerlo por mucho que use split, no se usarlo como quiero.

El código completo del programa es este:
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO.Ports; // No olvidar.

namespace Entrada_Arduino_AWF_3_CS
{
    public partial class Form1 : Form
    {
        // Utilizaremos un string como buffer de recepción.
        string Recibidos;

        public Form1()
        {
            InitializeComponent();

            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

                serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
            }
        }
        // Al recibir datos.
        private void Recepcion(object sender, SerialDataReceivedEventArgs e)
        {
            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
            Recibidos += serialPort1.ReadExisting();

            // Invocar o llamar al proceso de tramas.
            Invoke(new EventHandler(Actualizar));
        }

        // Procesar los datos recibidos en el bufer y extraer tramas completas.
        private void Actualizar(object sender, EventArgs e)
        {

            //// Asignar el valor de la trama al richTextBox.
            //richTextBox1.Text = Recibidos + "\n";

            //// Selecciona la posición final para leer los mensajes entrantes.
            //richTextBox1.SelectionStart = richTextBox1.Text.Length;

            //// Mantiene el scroll en la entrada de cada mensaje.
            //richTextBox1.ScrollToCaret();

                switch (Recibidos)
                {
                    case "1=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "1=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "2=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "2=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "3=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "3=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "4=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "4=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) // ¿El puerto está abierto?
            {
                serialPort1.Close(); // Puerto cerrado.
            }
        }
    }
}
Un cordial saludo y disculpen por las molestias.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #4 (permalink)  
Antiguo 03/12/2015, 21:03
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 2 meses
Puntos: 52
Respuesta: [C#] Cortar por lo sano

Ok, lo primero que haría es crear una lista de los pictureboxes


Código C#:
Ver original
  1. public partial class Form1 : Form
  2.     {
  3.         // Utilizaremos un string como buffer de recepción.
  4.         string Recibidos;
  5.  
  6.         private List<PictureBox> leds;
  7.  
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.  
  12.             //Inicializar la lista, esto debe ocurrir DESPUES de InitializeComponent()
  13.             this.leds = new[]{ this.pictureBox1, this.pictureBox2, this.pictureBox3, this.pictureBox4 }.ToList();

despues, solo es cuestion de un poco de LINQ:

Código C#:
Ver original
  1. private void Actualizar(object sender, EventArgs e)
  2.         {
  3.  
  4.             //// Asignar el valor de la trama al richTextBox.
  5.             //richTextBox1.Text = Recibidos + "\n";
  6.  
  7.             //// Selecciona la posición final para leer los mensajes entrantes.
  8.             //richTextBox1.SelectionStart = richTextBox1.Text.Length;
  9.  
  10.             //// Mantiene el scroll en la entrada de cada mensaje.
  11.             //richTextBox1.ScrollToCaret();
  12.  
  13.             var si = Properties.Resources.Led_rojo_encendido;
  14.             var no = Properties.Resources.Led_rojo_apagado;
  15.  
  16.             var valores = Recibidos.Split(' ')
  17.                                    .Select(x => x.Split('='))
  18.                                    .Select(x => new
  19.                                                 {
  20.                                                    Index = int.Parse(x[0]),
  21.                                                    Value = x[1] == "ON"
  22.                                                 });
  23.                          
  24.             foreach (var v in valores)
  25.             {
  26.                 this.leds[v.Index].Image = v.Value ? si : no;
  27.             }
  28.        }

No hace falta un switch ni ninguna cosa por el estilo.
  #5 (permalink)  
Antiguo 04/12/2015, 00:08
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 10 meses
Puntos: 8
Respuesta: [C#] Cortar por lo sano

Hola:

Tu código es corto, el mio que hice es largo y por fin funciona aunque a veces se le va la oya.

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO.Ports; // No olvidar.

namespace Entrada_Arduino_AWF_3_CS
{
    public partial class Form1 : Form
    {
        // Utilizaremos un string como buffer de recepción.
        string Recibidos;

        public Form1()
        {
            InitializeComponent();

            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

                serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
            }
        }
        // Al recibir datos.
        private void Recepcion(object sender, SerialDataReceivedEventArgs e)
        {
            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
            Recibidos += serialPort1.ReadExisting();

            // Invocar o llamar al proceso de tramas.
            Invoke(new EventHandler(Actualizar));
        }

        // Procesar los datos recibidos en el bufer y extraer tramas completas.
        private void Actualizar(object sender, EventArgs e)
        {

            // Asignar el valor de la trama al richTextBox.
            richTextBox1.Text += Recibidos;

            // Selecciona la posición final para leer los mensajes entrantes.
            richTextBox1.SelectionStart = richTextBox1.Text.Length;

            // Mantiene el scroll en la entrada de cada mensaje.
            richTextBox1.ScrollToCaret();

            char[] Delimitador = { ' ', '\r', '\n' };

            string[] Palabras = Recibidos.Split(Delimitador);


            foreach (string Comandos in Palabras)
            {
                switch (Comandos)
                {
                    case "1=ON":
                        pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "1=OFF":
                        pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "2=ON":
                        pictureBox2.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "2=OFF":
                        pictureBox2.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "3=ON":
                        pictureBox3.Image = Properties.Resources.Led_rojo_encendido;
                        Recibidos = "";
                        break;

                    case "3=OFF":
                        pictureBox3.Image = Properties.Resources.Led_rojo_apagado;
                        Recibidos = "";
                        break;

                    case "4=ON":
                        pictureBox4.Image = Properties.Resources.Led_rojo_encendido;
                        richTextBox1.Text += " " + DateTime.Now.ToString();
                        Recibidos = "";
                        break;

                    case "4=OFF":
                        pictureBox4.Image = Properties.Resources.Led_rojo_apagado;
                        richTextBox1.Text += " " + DateTime.Now.ToString();
                        Recibidos = "";
                        break;
            }
          }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) // ¿El puerto está abierto?
            {
                serialPort1.Close(); // Puerto cerrado.
            }
        }

        void Actualizar()
        {
            byte[] mBuffer = Encoding.ASCII.GetBytes("ACTUALIZAR"); // Envía comando ACTUALIZAR por el puerto.
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_Actualizar_Click(object sender, EventArgs e)
        {
            Actualizar();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Actualizar();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear(); // Limpiar contenido del richTextBox.
            Recibidos = "";
        }
    }
}
Saludos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #6 (permalink)  
Antiguo 04/12/2015, 08:32
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C#] Cortar por lo sano

Que tiene que ver la longitud del código con que sea correcto?

Yo también cuando ví los switch me dieron ganas de tirarme de los pelos. Primero por la cantidad de repetición de código, el mal uso de los "cases", la poca mantenibilidad del código y un largo etc.

En cambio la versión de agleiva es mucho mejor. Y esto se ve en detalles como que le da igual si hay 4, 1 o 20 "interruptores" que no va a tener que tocar el método "actualizar". Si buscas por internet verás que el switch podrás ver las diferentes formas de hacer refactorizarlo.
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 04/12/2015, 09:04
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 10 meses
Puntos: 8
Respuesta: [C#] Cortar por lo sano

Hola:

Probando el código.
Código C++:
Ver original
  1. var si = Properties.Resources.Led_rojo_encendido;
  2.             var no = Properties.Resources.Led_rojo_apagado;
  3.  
  4.             var valores = Recibidos.Split(' ')
  5.                                    .Select(x => x.Split('='))
  6.                                    .Select(x => new
  7.                                    {
  8.                                        Index = int.Parse(x[0]),
  9.                                        Value = x[1] == "ON"
  10.                                    });
  11.  
  12.             foreach (var v in valores)
  13.             {
  14.                 this.leds[v.Index].Image = v.Value ? si : no;
  15.             }

Me sale este error.

Cita:
Error CS1061 'Form1' no contiene una definición para 'leds' ni se encuentra ningún método de extensión 'leds' que acepte un primer argumento del tipo 'Form1' (¿falta alguna directiva using o una referencia de ensamblado?) Entrada_Arduino_AWF_3_CS C:\Users\Usuario\Documents\Visual Studio 2015\Projects\Entrada_Arduino_AWF_3_CS\Entrada_Ard uino_AWF_3_CS\Form1.cs 125
Código completo.
Código C++:
Ver original
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. using System.IO.Ports; // No olvidar.
  12.  
  13. namespace Entrada_Arduino_AWF_3_CS
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         // Utilizaremos un string como buffer de recepción.
  18.         string Recibidos;
  19.  
  20.         public Form1()
  21.         {
  22.             InitializeComponent();
  23.  
  24.             if (!serialPort1.IsOpen)
  25.             {
  26.                 try
  27.                 {
  28.                     serialPort1.Open();
  29.                 }
  30.                 catch (System.Exception ex)
  31.                 {
  32.                     MessageBox.Show(ex.ToString());
  33.                 }
  34.  
  35.                 serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
  36.             }
  37.  
  38.             //Inicializar la lista, esto debe ocurrir DESPUES de InitializeComponent()
  39.             this.leds = new[] { this.pictureBox1, this.pictureBox2, this.pictureBox3, this.pictureBox4 }.ToList();
  40.         }
  41.         // Al recibir datos.
  42.         private void Recepcion(object sender, SerialDataReceivedEventArgs e)
  43.         {
  44.             // Acumula los caracteres recibidos a nuestro 'buffer' (string).
  45.             Recibidos += serialPort1.ReadExisting();
  46.  
  47.             // Invocar o llamar al proceso de tramas.
  48.             Invoke(new EventHandler(Actualizar));
  49.         }
  50.  
  51.         // Procesar los datos recibidos en el bufer y extraer tramas completas.
  52.         private void Actualizar(object sender, EventArgs e)
  53.         {
  54.  
  55.             // Asignar el valor de la trama al richTextBox.
  56.             richTextBox1.Text += Recibidos;
  57.  
  58.             // Selecciona la posición final para leer los mensajes entrantes.
  59.             richTextBox1.SelectionStart = richTextBox1.Text.Length;
  60.  
  61.             // Mantiene el scroll en la entrada de cada mensaje.
  62.             richTextBox1.ScrollToCaret();
  63.  
  64.             //  char[] Delimitador = { ' ', '\r', '\n' };
  65.  
  66.             //  string[] Palabras = Recibidos.Split(Delimitador);
  67.  
  68.  
  69.             //  foreach (string Comandos in Palabras)
  70.             //  {
  71.             //      switch (Comandos)
  72.             //      {
  73.             //          case "1=ON":
  74.             //              pictureBox1.Image = Properties.Resources.Led_rojo_encendido;
  75.             //              Recibidos = "";
  76.             //              break;
  77.  
  78.             //          case "1=OFF":
  79.             //              pictureBox1.Image = Properties.Resources.Led_rojo_apagado;
  80.             //              Recibidos = "";
  81.             //              break;
  82.  
  83.             //          case "2=ON":
  84.             //              pictureBox2.Image = Properties.Resources.Led_rojo_encendido;
  85.             //              Recibidos = "";
  86.             //              break;
  87.  
  88.             //          case "2=OFF":
  89.             //              pictureBox2.Image = Properties.Resources.Led_rojo_apagado;
  90.             //              Recibidos = "";
  91.             //              break;
  92.  
  93.             //          case "3=ON":
  94.             //              pictureBox3.Image = Properties.Resources.Led_rojo_encendido;
  95.             //              Recibidos = "";
  96.             //              break;
  97.  
  98.             //          case "3=OFF":
  99.             //              pictureBox3.Image = Properties.Resources.Led_rojo_apagado;
  100.             //              Recibidos = "";
  101.             //              break;
  102.  
  103.             //          case "4=ON":
  104.             //              pictureBox4.Image = Properties.Resources.Led_rojo_encendido;
  105.             //              Recibidos = "";
  106.             //              break;
  107.  
  108.             //          case "4=OFF":
  109.             //              pictureBox4.Image = Properties.Resources.Led_rojo_apagado;
  110.             //              Recibidos = "";
  111.             //              break;
  112.             //  }
  113.             //}
  114.  
  115.             var si = Properties.Resources.Led_rojo_encendido;
  116.             var no = Properties.Resources.Led_rojo_apagado;
  117.  
  118.             var valores = Recibidos.Split(' ')
  119.                                    .Select(x => x.Split('='))
  120.                                    .Select(x => new
  121.                                    {
  122.                                        Index = int.Parse(x[0]),
  123.                                        Value = x[1] == "ON"
  124.                                    });
  125.  
  126.             foreach (var v in valores)
  127.             {
  128.                 this.leds[v.Index].Image = v.Value ? si : no;
  129.             }
  130.  
  131.             //richTextBox1.Text += "        " + DateTime.Now.ToString() + "\r";
  132.         }
  133.  
  134.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  135.         {
  136.             if (serialPort1.IsOpen) // ¿El puerto está abierto?
  137.             {
  138.                 serialPort1.Close(); // Puerto cerrado.
  139.             }
  140.         }
  141.  
  142.         void Actualizar()
  143.         {
  144.             byte[] mBuffer = Encoding.ASCII.GetBytes("ACTUALIZAR"); // Envía comando ACTUALIZAR por el puerto.
  145.             serialPort1.Write(mBuffer, 0, mBuffer.Length);
  146.         }
  147.  
  148.         private void button_Actualizar_Click(object sender, EventArgs e)
  149.         {
  150.             Actualizar();
  151.         }
  152.  
  153.         private void Form1_Load(object sender, EventArgs e)
  154.         {
  155.             Actualizar();
  156.         }
  157.  
  158.         private void button2_Click(object sender, EventArgs e)
  159.         {
  160.             richTextBox1.Clear(); // Limpiar contenido del richTextBox.
  161.             Recibidos = "";
  162.         }
  163.     }
  164. }

Saludos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #8 (permalink)  
Antiguo 04/12/2015, 09:06
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: [C#] Cortar por lo sano

Quizás tendrías que leer mejor el comentario que hizo Agleiva y así verás de donde sale esa variable...

Aprende a que cuando a comprender el código que copies o te dará muchos problemas ;)
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 04/12/2015, 09:18
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 10 meses
Puntos: 8
Respuesta: [C#] Cortar por lo sano

En esta ocasión la salidad la he cambiado por esta otra.

1=ON 2=ON 3=OFF 4=OFF\r\n

En Recibidos hay que quitar el \r y el \n.

Saludos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar

Etiquetas: cortar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:16.