Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#71
Gracias por la información.

Lo de los caracteres >=, no he probado con la versión .Net FrameWork 4.7, estoy probando el .Net 5.0, que por supuesto, aún está muy verde y hay cuelgues y todo en todo el IDE a veces. Tienen que seguir sacando actualizaciones.

Con .Net 5.0 se puede usar en los case el <=.

Con .Net 4.7 no me deja.

Me salió un mensaje que con C# 7.3 no se puede, a patir del C# 9.0 o posterior. Ya lo tengo claro.

Saludos.

#72
Buenas compañeros.

Por lo que veo, ya me han respondido. Lo acabé haciendo funcionar. Pero mi código es muy largo, feo y engorroso. No savía que se pudiera simplificar tanto como hicieron arriba. Aún así se los enseño. Es chapuza pero funciona.

Se los dejo como curiosidad. Voy a intertar interpretar lo que hicieron arriba.

Código C#
:

Código (csharp) [Seleccionar]
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;

namespace _74xx595_Vumetro_01_Net5._0
{
   public partial class Form1 : Form
   {
       int valorADC = 1000;

       public Form1()
       {
           InitializeComponent();
       }

       private void trackBar1_Scroll(object sender, EventArgs e)
       {
           // Variar valor con el tarackBar.
           valorADC = int.Parse("" + trackBar1.Value);
           this.Text = valorADC.ToString();

           #region Switch.
           switch (valorADC)
           {
               case >= 1000:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.Red;
                   panel4.BackColor = Color.Red;
                   panel5.BackColor = Color.Red;
                   panel6.BackColor = Color.Red;
                   panel7.BackColor = Color.Red;
                   panel8.BackColor = Color.Red;
                   break;

               case > 900:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.Red;
                   panel4.BackColor = Color.Red;
                   panel5.BackColor = Color.Red;
                   panel6.BackColor = Color.Red;
                   panel7.BackColor = Color.Red;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 800:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.Red;
                   panel4.BackColor = Color.Red;
                   panel5.BackColor = Color.Red;
                   panel6.BackColor = Color.Red;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 700:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.Red;
                   panel4.BackColor = Color.Red;
                   panel5.BackColor = Color.Red;
                   panel6.BackColor = Color.DarkRed;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 600:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.Red;
                   panel4.BackColor = Color.Red;
                   panel5.BackColor = Color.DarkRed;
                   panel6.BackColor = Color.DarkRed;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 500:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.Red;
                   panel4.BackColor = Color.DarkRed;
                   panel5.BackColor = Color.DarkRed;
                   panel6.BackColor = Color.DarkRed;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 400:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.Red;
                   panel3.BackColor = Color.DarkRed;
                   panel4.BackColor = Color.DarkRed;
                   panel5.BackColor = Color.DarkRed;
                   panel6.BackColor = Color.DarkRed;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 300:
                   panel1.BackColor = Color.Red;
                   panel2.BackColor = Color.DarkRed;
                   panel3.BackColor = Color.DarkRed;
                   panel4.BackColor = Color.DarkRed;
                   panel5.BackColor = Color.DarkRed;
                   panel6.BackColor = Color.DarkRed;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               case > 200:
               case > 0:
                   panel1.BackColor = Color.DarkRed;
                   panel2.BackColor = Color.DarkRed;
                   panel3.BackColor = Color.DarkRed;
                   panel4.BackColor = Color.DarkRed;
                   panel5.BackColor = Color.DarkRed;
                   panel6.BackColor = Color.DarkRed;
                   panel7.BackColor = Color.DarkRed;
                   panel8.BackColor = Color.DarkRed;
                   break;

               default:
                   this.Text = "Fuera de rango.";
                   break;
           }
           #endregion


Con el código de ustedes me queda así.

Código (csharp) [Seleccionar]
using System;
using System.Drawing;
using System.Windows.Forms;

namespace _74xx595_Vumetro_01_Net5._0
{
   public partial class Form1 : Form
   {
       int valorADC = 0;
       readonly Panel[] roPANELES;
       readonly Color[] roCOLORES;

       public Form1()
       {
           InitializeComponent();
           roPANELES = new Panel[] { panel1, panel2, panel3, panel4, panel5, panel6, panel7, panel8 };
           roCOLORES = new Color[] { Color.DarkRed, Color.Red };
           pinta("00000000");
       }

       private void trackBar1_Scroll(object sender, EventArgs e)
       {
           valorADC = this.trackBar1.Value;
           this.Text = valorADC.ToString();

           switch (valorADC)
           {
               case >= 1000:
                   pinta("11111111");
                   break;
               case > 900:
                   pinta("11111110");
                   break;
               case > 800:
                   pinta("11111100");
                   break;
               case > 700:
                   pinta("11111000");
                   break;
               case > 600:
                   pinta("11110000");
                   break;
               case > 500:
                   pinta("11100000");
                   break;
               case > 400:
                   pinta("11000000");
                   break;
               case > 300:
                   pinta("10000000");
                   break;
               case > 200:
                   pinta("00000000");
                   break;
           }

           
       }

       void pinta(string guia)
       {
           for (int i = 0; i < roPANELES.Length; i++)
           {
               roPANELES[i].BackColor = roCOLORES[int.Parse(guia.Substring(i, 1))];
           }            
       }
   }
}


En este código tengo una duda.
Código (csharp) [Seleccionar]
roPANELES[i].BackColor = roCOLORES[int.Parse(guia.Substring(i, 1))];

El 1 al final. ¿Qué significa exactamente?

Muchísimas gracias a los dos por los aportes he ideas. ;-) ;-) ;-) ;-) ;-) ;-) ;-)
#73
Buenas:

Hago algo mal. En esta captura se muestra unao Panel, que son 8 en total y debe cambiar de color de rojo oscuro o normal dependiendo de como muesves el trackBar.


Verr zoom.

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;

namespace _74xx595_Vumetro_01_Net5._0
{
    public partial class Form1 : Form
    {
        int valorADC = 1000;

        public Form1()
        {
            InitializeComponent();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            // Variar valor con el tarackBar.
            valorADC = int.Parse("" + trackBar1.Value);
            this.Text = valorADC.ToString();

            switch (valorADC)
            {
                case 1000:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.Red;
                    panel4.BackColor = Color.Red;
                    panel5.BackColor = Color.Red;
                    panel6.BackColor = Color.Red;
                    panel7.BackColor = Color.Red;
                    panel8.BackColor = Color.Red;
                    break;

                case 900:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.Red;
                    panel4.BackColor = Color.Red;
                    panel5.BackColor = Color.Red;
                    panel6.BackColor = Color.Red;
                    panel7.BackColor = Color.Red;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 800:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.Red;
                    panel4.BackColor = Color.Red;
                    panel5.BackColor = Color.Red;
                    panel6.BackColor = Color.Red;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 700:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.Red;
                    panel4.BackColor = Color.Red;
                    panel5.BackColor = Color.Red;
                    panel6.BackColor = Color.DarkRed;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 600:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.Red;
                    panel4.BackColor = Color.Red;
                    panel5.BackColor = Color.DarkRed;
                    panel6.BackColor = Color.DarkRed;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 500:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.Red;
                    panel4.BackColor = Color.DarkRed;
                    panel5.BackColor = Color.DarkRed;
                    panel6.BackColor = Color.DarkRed;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 400:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.Red;
                    panel3.BackColor = Color.DarkRed;
                    panel4.BackColor = Color.DarkRed;
                    panel5.BackColor = Color.DarkRed;
                    panel6.BackColor = Color.DarkRed;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 300:
                    panel1.BackColor = Color.Red;
                    panel2.BackColor = Color.DarkRed;
                    panel3.BackColor = Color.DarkRed;
                    panel4.BackColor = Color.DarkRed;
                    panel5.BackColor = Color.DarkRed;
                    panel6.BackColor = Color.DarkRed;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                case 200:
                    panel1.BackColor = Color.DarkRed;
                    panel2.BackColor = Color.DarkRed;
                    panel3.BackColor = Color.DarkRed;
                    panel4.BackColor = Color.DarkRed;
                    panel5.BackColor = Color.DarkRed;
                    panel6.BackColor = Color.DarkRed;
                    panel7.BackColor = Color.DarkRed;
                    panel8.BackColor = Color.DarkRed;
                    break;

                default:
                    this.Text = "Fuera de rango.";
                    break;
            }
        }
    }
}


¿Alguna idea?

Saludos.
#74
Buenas:

Dentro de poco me llega un SAI o UPS que tiene dos puertos, USB y el RS232. El que voy a sar es el RS232 o conocido como puerto serie de toda la vida y el PC nuevo también usa el RS232. Espero no usar el pin 4 DTR para controlar el puerto serie, ajajajaja.


Ver zoom.

Aquí abajo, muestra los mensajes de aviso y error. En el display de la UPS solo muestra códigos en el cual después para entender lo que me están hablando debo mirar esta tabla de abajo.


Ver zoom.

Como puedes ver arriba, por ejemplo: Código A64. Como no se que es el código A64 cuando la UPS directamente l muestra con su display, debo mirar esta table y dice:
A64 => Aviso sobrecarga.

Entonces con Arduino y el puerto RS232 debo extraer la información y que me lo muestre en textos en un LCD de Arduino así:

A64: Aviso de sobrecarga.

Sea con un display de 20x4 o otro que me quepa muchos comentarios o descripcioines de los avisos o fallos del UPS.

Según el fabricante, me dice que mire esta parte, que es la que estoy buscando, los Flags.


Ver zoom.

Antes de tocar Arduino, prefiero hacer una Interfaz con Visual Studio .Net. Directmente con el puerto RS232.

Solo lee los avisos o erroree mostrados desde la UPS hacia el PC. Solo toca interpretar lo que me cuenta este documento en PDF que lo dejo para que lo descarguen.

Si tiene alguna idea como extraer esa información me lo hacen saber y empiezo a programar. La parte que estoy haciendo ahora solo es preparar la interfaz, ya iré mostrando avances poco a poco, por supuesto, luego iré por Arduino al derecho y al revés, ejjejej.

Descarga PDF.

Sabiendo todo esta información.

Mi intención es crear una interfaz con Windows Form de C#. Usar el componente serialPort1 que lo arrastro al formulario y pongo un label.

La pregunta es:

¿Cómo muestro los datos de la UPS indicado en la tercera captura arriba o en el manual en C#?

Esa es la cuestión.

Que tengan buen día. A scar esto adelante. ;)

PD: Me cuesta creer que todavían saquen PC y UPS con comunicación con RS232 directamente. Es de agradecer.
#75
Buensa:

¿Alguna idea de leer, borrar, escribir......?

Saludos.
#76
Buenas:

Una cosa es Arduino y la otra RaspBerry Pico.

Mira aquí la comparativa.

[youtube=640,360]https://www.youtube.com/watch?v=bAAv7i5TISc[/youtube]

Lo deja claro.
#77


Ver imagen.

Este proyecto ya es un reto para muchos, jajajja, aún así se puede intentar.

Aquí tengo un simulador de lavadora, puedes controlar el giro del tambor o motor, velocidad, nivel de agua. Es totalmente funcional.

Hay en este caso aunque si funciona, quiero ignorarlo para el próximo programa, Giro del motor.

La mejora o el próximo programa funciona desde el puerto serie sin usar ningún trackBar.

trackBar_Velocidad_motor funciona los valores como máximo a 100 y mínimo a 0.

trackBar_Nivel_de_agua funciona los valores como máximo a 90 y mínimo a -90.

Los sustitutos del trackBar son datos que llegan desde el puerto serie, algo así como esto, por ejemplo:

Código (csharp) [Seleccionar]
50, 80

El ejemplo de arriba indica el número 50, que varía de 0 a 100, la velocidad. El 80 es el caso del 90 a -90 del nivel de agua.

Esos datos si quiero que esté. Puede recibir datos a 9600 baudios y por cada 1000 milisegundos, o lo que es lo mismo, a cada segundo.

El código completo de este programa con trackBar es este.
Código (csharp) [Seleccionar]
/*
Te explico la formula

float fDeltaAngulo = (((nRPM * 360) / (60 * 1000)) * timer.Interval) * ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximun)

   1. (nRPM * 360) -> Grados por minuto.
   2. (60 * 1000) -> Milisegundos por minuto.
   3. ((nRPM * 360) / (60 * 1000)) -> Grados por milisegundo.
   4. (((nRPM * 360) / (60 * 1000)) * timer.Interval) -> Grados por tick del timer.
   5.  ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximun) -> Porcentaje de la velocidad.
   6. (((nRPM * 360) / (60 * 1000)) * timer.Interval) * ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximun) -> Calcula los grados por tick del timer aplicando un porcentaje.

Según esta formula, si el trackbar esta en 0, grados por tick * 0 = 0 (esta parado), si el trackbar esta al maximo, grados por tick * 1 = grados por tick (el angulo aumenta al máximo).
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Lavadora_05
{
    public partial class Form1 : Form
    {
        // Variables.
        private Pen lápiz2;
        private Pen lápiz3;
        private Pen lápiz4;
        private float angulo;
        private SolidBrush agua;

        private GraphicsPath m_lavadora;
        private GraphicsPath m_agua;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Text = "Simulador lavadora";
            pictureBox1.Size = new Size(300, 300);
            pictureBox1.BackColor = Color.LightGray;

            lápiz2 = new Pen(Color.DarkGray, 10);
            lápiz2.StartCap = LineCap.ArrowAnchor;
            lápiz2.EndCap = LineCap.RoundAnchor;

            lápiz3 = new Pen(Color.Black, 5);
            lápiz4 = new Pen(Color.Gray, 10);

            angulo = 0;

            agua = new SolidBrush(Color.FromArgb(200, 0, 155, 219)); // Transparencia del agua 200.
            trackBar_Nivel_de_agua.Value = -90; // Para que empiece sin agua.
        }

        // Dibuja y colorea.
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);

            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.RotateTransform(angulo);
            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.DrawPath(lápiz2, m_lavadora);
            e.Graphics.ResetTransform();
            e.Graphics.FillPath(agua, m_agua);
        }

        // Refresca el valor actual.
        private void trackBar_Giro_del_motor_ValueChanged(object sender, EventArgs e)
        {
            angulo = (float)trackBar_Giro_del_motor.Value;
            pictureBox1.Refresh();
        }

        // Cambia el tamaño del control.
        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            int ancho = pictureBox1.ClientSize.Width;
            int alto = pictureBox1.ClientSize.Height;

            m_lavadora = new GraphicsPath();

            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
            m_lavadora.CloseFigure();

            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, ancho - 40, alto - 40, trackBar_Nivel_de_agua.Value, 180 - 2 * trackBar_Nivel_de_agua.Value);
            m_agua.CloseFigure();
        }

        private void trackBar_Nivel_de_agua_ValueChanged(object sender, EventArgs e)
        {
            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, pictureBox1.ClientSize.Width - 40, pictureBox1.ClientSize.Height - 40, -trackBar_Nivel_de_agua.Value, 180 - 2 * -trackBar_Nivel_de_agua.Value);
            m_agua.CloseFigure();
            pictureBox1.Refresh();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //60 vueltas por minuto
            float nRPM = 60;

            float fDeltaAngulo = (((nRPM * 360) / (60 * 1000)) * (float)timer1.Interval) * ((float)trackBar_Velocidad_motor.Value / (float)trackBar_Velocidad_motor.Maximum);
            float track = (float)trackBar_Velocidad_motor.Value;
            angulo += fDeltaAngulo;
            label_angulo.Text = "angulo " + angulo.ToString();
            label_fDeltaAngulo.Text = "fDeltaAngulo " + fDeltaAngulo.ToString();
            pictureBox1.Refresh();

        }

        private void button_Empezar_Click(object sender, EventArgs e)
        {
            timer1.Start();
            //timer1.Enabled = true; // También válido.
        }

        private void button_parar_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            //timer1.Enabled = false; // También válido.
        }
    }
}


El código que he intentado es este pero no funciona ni una parte y está incompleto.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Lavadora_07
{
    public partial class Form1 : Form
    {
        // Utilizaremos un string-builder como búfer auxiliar.
        // La trama llegará fragmentada.
        StringBuilder sb;

        // Nuestro delegado recibe como argumento el string con la trama.
        readonly Action<string> NuevaTrama;

        // Variables.
        private Pen lápiz2;
        private Pen lápiz3;
        private Pen lápiz4;
        private float angulo;
        private SolidBrush agua;

        private GraphicsPath m_lavadora;
        private GraphicsPath m_agua;

        // Variables sustituto del trackBar.
        private int trackBar_Nivel_de_agua = 0;
        private int trackBar_Velocidad_motor = 0;

        public Form1()
        {
            InitializeComponent();

            sb = new StringBuilder();
            NuevaTrama = Actualizar;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
            try
            {
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
            }

            catch
            {
                MessageBox.Show("No encuentra ningún puerto físico ni virtual.", "Aviso:",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
            comboBox_Puerto.DataSource = SerialPort.GetPortNames();

            // // Añade puertos disponibles físicos  y virtuales.
            serialPort1.PortName = comboBox_Puerto.Text.ToString();

            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

            // Dibujo tambor lavadora.
            pictureBox1.Size = new Size(300, 300);
            pictureBox1.BackColor = Color.LightGray;

            lápiz2 = new Pen(Color.DarkGray, 10);
            lápiz2.StartCap = LineCap.ArrowAnchor;
            lápiz2.EndCap = LineCap.RoundAnchor;

            lápiz3 = new Pen(Color.Black, 5);
            lápiz4 = new Pen(Color.Gray, 10);

            angulo = 0;

            agua = new SolidBrush(Color.FromArgb(200, 0, 155, 219)); // Transparencia del agua 200.
            trackBar_Nivel_de_agua = -90; // Para que empiece sin agua.
        }

        // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
        protected override void WndProc(ref Message USB)
        {
            if (USB.Msg == 0x219)
            {
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
            }

            base.WndProc(ref USB); // Detecta si hay cambios en el usb y si los hay los refleja.
        }

        // Dibuja y colorea.
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(lápiz3, 10, 10, pictureBox1.ClientSize.Width - 20, pictureBox1.ClientSize.Height - 20);
            e.Graphics.DrawEllipse(lápiz4, 10, 10, pictureBox1.ClientSize.Height - 20, pictureBox1.ClientSize.Height - 20);

            e.Graphics.TranslateTransform(pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.RotateTransform(angulo);
            e.Graphics.TranslateTransform(-pictureBox1.ClientSize.Width / 2, -pictureBox1.ClientSize.Height / 2);
            //e.Graphics.DrawLine(lápiz2, 20, pictureBox1.ClientSize.Height / 2, pictureBox1.ClientSize.Width / 2, pictureBox1.ClientSize.Height / 2);
            e.Graphics.DrawPath(lápiz2, m_lavadora);
            e.Graphics.ResetTransform();
            e.Graphics.FillPath(agua, m_agua);
        }

        // Cambia el tamaño del control.
        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            int ancho = pictureBox1.ClientSize.Width;
            int alto = pictureBox1.ClientSize.Height;

            m_lavadora = new GraphicsPath();

            m_lavadora.AddEllipse(20, 20, ancho - 40, alto - 40);
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(20, (alto / 2), ancho - 20, (alto / 2));
            m_lavadora.CloseFigure();
            m_lavadora.AddLine(ancho / 2, 20, ancho / 2, alto - 20);
            m_lavadora.CloseFigure();

            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, ancho - 40, alto - 40, trackBar_Nivel_de_agua, 180 - 2 * trackBar_Nivel_de_agua);
            m_agua.CloseFigure();
        }

        // Conectar comunicación con el puerto serie.
        private void button_Conectar_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente.
                serialPort1.BaudRate = Convert.ToInt32(comboBox_Baudios.Text); // Baudios.
                serialPort1.Open(); // Abrir puerto.
                comboBox_Puerto.Enabled = false;
                comboBox_Baudios.Enabled = false;
                button_Conectar.Enabled = false;
                button_Desconectar.Enabled = true;
            }
            catch
            {
                MessageBox.Show("El puerto no existe.", "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // Desconectar comunicación con el puerto serie.
        private void button_Desconectar_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close(); // Cerrar puerto.
                comboBox_Puerto.Enabled = true;
                comboBox_Baudios.Enabled = true;
                button_Conectar.Enabled = true;
                button_Desconectar.Enabled = false;
            }

            catch (Exception error)
            {
                MessageBox.Show(error.Message, "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // Al cerrar el formulario, antes cierra el puerto si está abierto.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                serialPort1.Close(); // Cerrar puerto.
            }

            catch (Exception error)
            {
                MessageBox.Show(error.Message, "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // Recibe datos por el puerto serie.
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Caracter/es disponible/s desde la última vez.
            string recibidos = serialPort1.ReadExisting();

            // analizamos cada caracter recibido
            foreach (char item in recibidos)
            {
                switch (item)
                {
                    // Ignoramos el \u000D
                    case '\r':
                        break;

                    // Aquí detectamos el final de la trama \u000A
                    case '\n':
                        // y la enviamos al control.
                        Invoke(NuevaTrama, sb.ToString());

                        // Luego limpiamos el búfer.
                        sb.Clear();
                        break;

                    // Cualquier otro caracter recibido, lo agregamos al búfer.
                    default:
                        sb.Append(item);
                        break;
                }
            }
        }

        private void Actualizar(string trama)
        {
            // Delimitador. Ignoramos las comas.
            string[] datosArray = trama.Split(',');

            // Compara si dos datos del array es igual a la cantidad total que en este
            // caso son 2. Si es igual a 2, entonces ejecuta todo el código dentro del if.
            if (datosArray.Length == 2)
            {
                // Mostrar datos.
                label_Entrada_analogica_A1.Text = "Entrada Analógica A1: " + datosArray[0];
                label_Entrada_analogica_A2.Text = "Entrada Analógica A2: " + datosArray[1];
            }
        }

        private void trackBar_Nivel_de_agua_ValueChanged(object sender, EventArgs e)
        {
            m_agua = new GraphicsPath();

            m_agua.AddArc(20, 20, pictureBox1.ClientSize.Width - 40, pictureBox1.ClientSize.Height - 40, -trackBar_Nivel_de_agua, 180 - 2 * -trackBar_Nivel_de_agua);
            m_agua.CloseFigure();
            pictureBox1.Refresh();
        }
    }
}


¿Alguna idea de este proyectado tipo reto?

Un cordial saludos camaradas.
#78
Se tiene que ver así.
Al lados números recibidos desde el puerto.

#79
Buenas:

Mi idea es que lea datos desde el puerto serie que viene de Arduino.  La interfaz está hecho con Consola de C# 2019.

Como se puede ver en la imagen, lo datos no se ven correctamente.

Ver imagen.

Código consola C#:
Código (csharp) [Seleccionar]
using System;
using System.IO;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace Lectura_seis_potenciometros_Arduino_consola_01
{
    class Program
    {
        // Utilizaremos un string "Recibidos" como buffer de recepción.
        public static string Recibidos;
        public static bool _continua;
        public static SerialPort Puerto_serie;

        static void Main(string[] args)
        {
            string COM = "";
            StringComparer comparaString = StringComparer.OrdinalIgnoreCase;
            Thread readThread = new Thread(Leer);

            // Título de la ventana.
            Console.Title = "Lectura 6 potenciómetros desde Arduino";

            // Tamaño de la ventana, x, y.
            Console.SetWindowSize(45, 20);

            // Color de fondo.
            Console.BackgroundColor = ConsoleColor.Gray;

            // Color de las letras.
            Console.ForegroundColor = ConsoleColor.Black;

            // Limpiar pantalla y dejarlo todo gris.
            Console.Clear();

            // Visible el cursor.
            Console.CursorVisible = true;

            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
            Puerto_serie = new SerialPort();

            // Obtenga una lista de nombres de puertos serie.
            string[] puertos = SerialPort.GetPortNames();

            Console.WriteLine("Se encontraron los siguientes puertos series:");

            // Muestre el nombre de cada puerto en la consola.
            foreach (string puerto in puertos)
            {
                Console.WriteLine(puerto);
            }

            // Configuración.
            Console.Write(@"
Introduzca un número para seleccionar
puerto COM.
Por ejemplo el 4, sería COM4.

Puerto: ");
            COM = Console.ReadLine(); // Escribir el número del puerto.
            Console.Clear(); // Limpiar pantalla.

            Puerto_serie.PortName = "COM" + COM; // Número del puerto serie.

            // Configuración del puerto serie.
            Puerto_serie.BaudRate = 115200;
            Puerto_serie.Parity = Parity.None;
            Puerto_serie.StopBits = StopBits.One;
            Puerto_serie.DataBits = 8;
            Puerto_serie.Handshake = Handshake.None;
            Puerto_serie.RtsEnable = true;

            // Establecer los tiempos de espera de lectura / escritura.
            //Puerto_serie.ReadTimeout = 500; // 500 // Milisegundos.
            //Puerto_serie.WriteTimeout = 500; // 500

            // Comprueba si puede abrir el puerto serie.
            try
            {
                Puerto_serie.Open(); // Abrir el puerto serie.
            }

            // En caso que diera algún error como que no encuentra el puerto seleccionado
            // muestra una excepción.
            catch (IOException)
            {
                Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
                Console.CursorVisible = false;
                Console.SetCursorPosition(16, 6);
                Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe
                o no lo encuentra.");
                Console.ReadKey();   // Pulse cualquier tecla.
                Environment.Exit(1); // Salir de la aplicación.
            }

            _continua = true;
            readThread.Start();

            // Cursos invisible.
            Console.CursorVisible = false;

            // Mostrar dibujo en pantalla.
            Console.SetCursorPosition(3, 3);
            Console.Write("Potenciómetro A0: ");
            Console.SetCursorPosition(3, 5);
            Console.Write("Potenciómetro A1: ");
            Console.SetCursorPosition(3, 7);
            Console.Write("Potenciómetro A2: ");
            Console.SetCursorPosition(3, 9);
            Console.Write("Potenciómetro A3: ");
            Console.SetCursorPosition(3, 11);
            Console.Write("Potenciómetro A4: ");
            Console.SetCursorPosition(3, 13);
            Console.Write("Potenciómetro A5: ");

            // Posición para empezar a dibijar las ─.
            Console.SetCursorPosition(0, 15);

            // Generar línea.
            for (int i = 0; i <= 44; i++)
            {
                Console.Write("─"); // ASCII: Alt + 196: ─
            }

            Console.SetCursorPosition(17, 17);
            Console.Write("Puerto: COM" + COM);

            // Bloquea el subproceso.
            readThread.Join();

            // Cierra el puerto serie.
            Puerto_serie.Close();
        }

        // Lee mensaje recibido.
        public static void Leer()
        {
            // Si _continue es true se ejecuta todas las instrucciones dentro de while.
            while (_continua) // _continua
            {
                try
                {
                    // Almacena en la variable mensaje cualquier caracter o mensaje recibido.
                    Recibidos = Puerto_serie.ReadLine();

                    // Muestra en pantalla mensaje recibido.
                    Console.WriteLine(Recibidos);

                    string[] datosArray = Recibidos.Split(',');

                    if (datosArray.Length == 6) // 6 potenciómetros.
                    {
                        Console.SetCursorPosition(20, 3);
                        Console.Write(datosArray[0]); // Entrada analógica A0.
                        Console.SetCursorPosition(20, 5);
                        Console.Write(datosArray[1]); // Entrada analógica A1.
                        Console.SetCursorPosition(20, 7);
                        Console.Write(datosArray[2]); // Entrada analógica A2.
                        Console.SetCursorPosition(20, 9);
                        Console.Write(datosArray[3]); // Entrada analógica A3.
                        Console.SetCursorPosition(20, 11);
                        Console.Write(datosArray[4]); // Entrada analógica A4.
                        Console.SetCursorPosition(20, 13);
                        Console.Write(datosArray[5]); // Entrada analógica A5.
                    }

                    // Limpiar buffer.
                    Recibidos = "";

                }
                catch (TimeoutException)
                {
                    Console.WriteLine("ERROR");
                }
            }
        }
    }
}


Código Arduino.
int pinA0 = A0;
int pinA1 = A1;
int pinA2 = A2;
int pinA3 = A3;
int pinA4 = A4;
int pinA5 = A5;
int valorPotA0 = 0;
int valorPotA1 = 0;
int valorPotA2 = 0;
int valorPotA3 = 0;
int valorPotA4 = 0;
int valorPotA5 = 0;

void setup()
{
  Serial.begin(115200);
  pinMode(pinA0, INPUT);
  pinMode(pinA1, INPUT);
  pinMode(pinA2, INPUT);
  pinMode(pinA3, INPUT);
  pinMode(pinA4, INPUT);
  pinMode(pinA5, INPUT);
}

void loop()
{
  valorPotA0 = analogRead(pinA0);
  valorPotA1 = analogRead(pinA1);
  valorPotA2 = analogRead(pinA2);
  valorPotA3 = analogRead(pinA3);
  valorPotA4 = analogRead(pinA4);
  valorPotA5 = analogRead(pinA5);

  Serial.print(valorPotA0);
  Serial.print(",");
  Serial.print(valorPotA1);
  Serial.print(",");
  Serial.print(valorPotA2);
  Serial.print(",");
  Serial.print(valorPotA3);
  Serial.print(",");
  Serial.print(valorPotA4);
  Serial.print(",");
  Serial.println(valorPotA5);
  delay(100); // 100 mili segundos o 0.1 segundos..
}


Los datos del potenciómetro debe mostrarse en su etiqueta del 0 al 1023, por ejemplo:

Potenciómetro A0: 785

Y no un desorden como muestra arriba.

¿Alguna idea?

Que tengas buen día.
#80
Buenas gente por Naviades:

He intentado pero no me gusta mucho.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Escribir_mas_de_255_caracteres_consola_01
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] array = new byte[500];
            ConsoleKey key;
            int i = 0;

            while ((key = Console.ReadKey(true).Key) != ConsoleKey.Enter)
            {
                Console.Write(key.ToString());
                array[i++] = Convert.ToByte(key);
            }
            Console.WriteLine();
            Console.WriteLine(Encoding.Default.GetString(array));
            Console.ReadLine();

        }
    }
}


Seguro que se puede hacer mejor.

Saludos.