none
Hilo o Thread no se ejecuta RRS feed

  • Pregunta

  • Buenas:

    Tengo un programa en consola C# en el cual al recibir datos el hilo o thread no se ejecuta nunca. Los datos vienen del puerto serie y este es su códgo.

    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");
                    }
                }
            }
        }
    }

    ¿Alguna idea?

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 20 de febrero de 2021 8:02

Todas las respuestas

  • No se ve nada evidente a simple vista. Es el momento de usar el debugger. Asegúrate de que tienes abierta la ventana de "threads" para poder ver todos los hilos. Pon puntos de ruptura tanto antes del .Start() como al principio de Leer(). Ejecuta el programa y cerciórate de que el debugger se para antes del Start (si no llega a ese punto entonces no es de extrañar que no se ejecute el hilo). Una vez ahí, ejecuta un paso al frente para que se ejecute el Start y comprueba que se detiene en el punto de ruptura que pusiste en Leer. Si se para ahí, quiere decir que sí que se está ejecutando el hilo. Si a partir de ahí no hace lo que esperabas que hiciese, es cuestión de seguir avanzando paso a paso con el debugger viendo lo que hace hasta que encuentres el punto en el que no se comporta como se esperaba.
    sábado, 20 de febrero de 2021 9:48
    Moderador
  • Deleted
    sábado, 20 de febrero de 2021 12:22
  • Viene desde C#.

    En Arduino como indicas puse esto.

    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.print(valorPotA5);
      Serial.print(",");
      delay(100); // 100 mili segundos o 0.1 segundos..
    }
    Las
     pruebas que estoy haciendo es de C# a C#. Con Arduino se comporta igual.


    http://electronica-pic.blogspot.com




    • Editado Metaconta sábado, 20 de febrero de 2021 16:00
    sábado, 20 de febrero de 2021 15:50
  • Deleted
    sábado, 20 de febrero de 2021 16:59
  • Si pongo esto en C#.

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

    Me da errores.

    Gravedad    Código    Descripción    Proyecto    Archivo    Línea    Origen    Estado suprimido
    Error    CS1012    Demasiados caracteres en literal de carácter    Lectura_seis_potenciometros_Arduino_consola_01    C:\Users\Meta\Documents\Visual Studio 2019\Projects\Lectura_seis_potenciometros_Arduino_consola_01\Lectura_seis_potenciometros_Arduino_consola_01\Program.cs    153    IntelliSense    Activo

    En ARduino:

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


    http://electronica-pic.blogspot.com


    • Editado Metaconta lunes, 22 de febrero de 2021 0:20
    lunes, 22 de febrero de 2021 0:20
  • Deleted
    lunes, 22 de febrero de 2021 1:32
  • Si pongo esto en C#.

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

    Me da errores.

    Lógico que dé errores. No puedes escribir en el código fuente 'cr' ni 'lf'. Las comillas simples indican que estás definiendo un dato de tipo "char" (un solo carácter). Pero dentro de las comillas estás poniendo dos caracteres, cosa que es incompatible con el tipo char. Si lo que querías es poner un retorno de carro y salto de línea, se usa un código especial para indicarlos: '\r', '\n'.

    Esto no tiene nada que ver con tus problemas de recepción por el puerto serie, pero al fin y al cabo la pregunta está en el foro de C# y esto es un tema de sintaxis del lenguaje, que toca de lleno al C#.

    • Marcado como respuesta EricRRModerator miércoles, 24 de febrero de 2021 15:30
    • Desmarcado como respuesta Metaconta miércoles, 24 de febrero de 2021 20:48
    • Marcado como respuesta EricRRModerator jueves, 25 de febrero de 2021 23:32
    • Desmarcado como respuesta Metaconta domingo, 7 de marzo de 2021 5:26
    lunes, 22 de febrero de 2021 9:50
    Moderador
  • Hola Metaconta,

    ¿Alguna novedad sobre la consulta realizada?

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 22 de febrero de 2021 15:08
    Moderador
  • Por primera vez se ve algo. PEro no es así como debería.

    ¿Algo se nos escapa?

    Saludos.


    http://electronica-pic.blogspot.com

    martes, 23 de febrero de 2021 17:20