No lee bien los datos de entrada

Iniciado por Meta, 24 Febrero 2021, 22:21 PM

0 Miembros y 1 Visitante están viendo este tema.

Meta

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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Meta

Se tiene que ver así.
Al lados números recibidos desde el puerto.

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/