Prueben mis programas sobre puerto serie y aporten ideas

Si vas hacer una interfaz RS232 para controlar motores deberías aplicar un protocolo (podria ser MODBUS RTU) para manejar los errores debido a la interferencia producida por los motores.
 
Hola:

Para no confundirse, pues usar este conversión de códigos.

http://converter.telerik.com/

Lo he intentado y no lo capto. Me funciona mejor como lo hice arriba. Quiero que me funcione perfecto, como un programa decente, nada de cosas raras.

Saludos.

no me funciona esa pagina, pero la idea es que ignore los nuevos datos hasta que haya terminado de procesar el dato antiguo

algo mas o menos asi
y llama a la funcion actualizar() sin cosas raras
la idea es que el programa se espere hasta que ejecute todo
y luego cambie a trabajando= false que indicara que esta libre para procesar un nuevo dato

y tambien prueba el exe directamente ya que el emulador del ide no es lo suficentemente rapido


Código:
bool trabajando = false; ' variable  de bandera


// Al recibir datos.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
	if (trabajando == true)
		return;
	trabajando = true;

// Acumula los caracteres recibidos a nuestro 'buffer' (string).
	// Recibidos = serialPort1.ReadLine();

 ///aca el codigo que falta ReadLine

// llamar a la funcion
	            Actualizar();

	trabajando = false;
}


la verdad es que tu codigo esta muy complicado
te vuelvo a recomendar https://ingsistele.wordpress.com/2012/02/25/conectar-a-un-puerto-serie-com-usando-vb-net/ ylo pasas a c#
 
A ver, un programa decente ya a estas alturas, no debería ser del tipo consola.

Haré los dos tipos y hasta WPF también. Me hace apetece hacerlo y hay usuarios que me lo han pedido que lo hiciera, porque en algunos centros de enseñansas así lo piden. La consola se usa más de lo que imaginas, por ejemplo, cuando aprendes a programar. Es más, hasta vale para curiosos.

Es lógico que un programa que recibe y envía datos en RS-232, se congele o no responda porque el protocolo y su correspondiente interpretación no son muy rápidos. Aún así usando su máximo de baudios permitidos.

Por lo que he estado leyendo, no es el protocolo. Es problema de hilos y sobrecarga.

Enfócate por lo que ya está hecho, comprobado que funciona, y mejorarás lo que quieres hacer.
Así sean GUIs en C++, C, Ensamblador de x bits, Basic, Pascal, Borland C, C#, etc.

Códigos y ejemplos sobre interfaces en RS-232, hay de sobra. Y muchas muy buenas. (y)

Hay puede haber muchos, pero debo modificar muchas cosas en adaptarlo como lo quiero. ;)

Hablar de dudas sobre interfaces RS-232 en éstos tiempos, ya no va.(n)

Dentro del mundo del microcontrolador y la electrónica, va demasiado y mucho. Lo que no va es hacer un dispositivo una empresa con RS-232, solo USB y otros protocolos. RS-232 no se le ingnora ni en su sombra.

Hola @analogico:

Lo que cuentas es lo que intentaba hacer pero lo hice diferente, que es el código indicado atrás.

Voy a reescribir el código desde cero para que se entienda lo más básico, no usaré conversiones de porcentaje y de tensión en este caso. Este código también se cuelga al cerrar la aplicación.

Te lo muestro así ahora para que entiendas el concepto.

Código:
using System;
using System.Windows.Forms;

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

namespace Arduino_In_Analogico_prueba_02
{
    public partial class Form1 : Form
    {
        // Utilizaremos un string como buffer de recepción.
        string Recibidos = "";
        string Recibidos_Correcto = "";
        int Variar_este_valor = 0;

        public Form1()
        {
            InitializeComponent();

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

                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            }
        }

        // Al recibir datos.
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Recibidos = serialPort1.ReadExisting(); // Entrada de datos por el puerto serie.
            Recibidos_Correcto = Recibidos.Replace("\n\r", "").Replace("\n","").Replace("\r",""); // Delimitador. Anular \n y \r.

            Invoke(new EventHandler(Actualizar));
        }

        // Procesar los datos recibidos en el bufer y extraer tramas completas.
        private void Actualizar(object sender, EventArgs e)
        {
            try
            {
                Variar_este_valor = Convert.ToInt32(Recibidos_Correcto); // Convertir string a int.
            }

            catch (FormatException)
            {
                // La cadena de entrada no tiene el formato correcto.
                return;
            }

            label1.Text = Recibidos_Correcto.ToString(); // Mostrar resultado en un label y convertirlo a string.
        }
    }
}
Sigo con ello.

Este código es más sencillo de entender.

Cuando tenga todo acabado mi idea del documento final en pdf, es hacer muchos ejemplos usando un solo lenguaje, como el C#, cuando todo funcione a por VB .net y V C++ .net.

Saludos.
 
Última edición:
Hola:

He logrado en modo consola que no parpadee toda la pantalla, pero me falla la parte que al vovler a 0 la barra de progreso, es decir, al aumentar el valor hast alos 1023 en decimal, la barra de progreso progresa, al reducirlo a 0, la barra se queda donde está.

Ese es el problema que tengo ahora, tan pronto como pueda, lo estoy solucinoando.

Aquí el código como curiosidad. Código en modo consola C#.
Código:
using System;
using System.IO.Ports; // No olvidar.
using System.IO;

namespace Porcentaje_Barra_P_Serie_Consola_3_CS
{
    class Program
    {
        public static string Recibidos = "";
        public static double Resultado_Porcentaje = 0;
        public static double Resultado_Voltios = 0;
        public static double Mitad_barra = 0;


        static void Main(string[] args)
        {
            string COM = "";

            // Tamaño ventana consola.
            Console.WindowWidth = 55; // X.
            Console.WindowHeight = 15; // Y.
            Console.Title = "Serial Port C# - v.02"; // Título de la ventana.

            SerialPort Puerto_serie;

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

            // 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();

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


            Puerto_serie.BaudRate = 115200; // Baudios.
            Puerto_serie.Parity = Parity.None; // Paridad.
            Puerto_serie.DataBits = 8; // Bits de datos.
            Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
            Puerto_serie.Handshake = Handshake.None; // Control de flujo.

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

            try
            {
                Puerto_serie.Open(); // Abrir el puerto serie.
            }

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

            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            Console.Read();
            Puerto_serie.Close(); // Cerrar puerto.
        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)

        {

            try
            {
                SerialPort sp = (SerialPort)sender;
                Recibidos = sp.ReadExisting();
                //Console.Clear();

                Recibidos = Recibidos.Replace("\n\r", "");

                int Variar_este_valor = Convert.ToInt32(Recibidos);

                Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
                Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);

                
                Console.SetCursorPosition(0, 1);
                Console.Write("Datos recibidos: ");
                Console.SetCursorPosition(17, 1);
                Console.Write("    ");
                Console.SetCursorPosition(17, 1);
                Console.Write(Recibidos);

                
                Console.SetCursorPosition(0, 3);
                Console.Write("0 %                     50 %                   100 %");
                Console.SetCursorPosition(0, 4);
                Console.Write("┌────────────────────────┬───────────────────────┐");
                Console.ForegroundColor = ConsoleColor.Yellow;

                // Se dibide por dos la barra del porcentaje para que quepa decuadamente en la pantalla.
                Mitad_barra = Resultado_Porcentaje / 2;

                if (Mitad_barra > 50)
                {
                    Mitad_barra = 50;
                }

                // Borrado de barra de progreso para actualizar después su posición actual.
                Console.SetCursorPosition(0, 5);
                //Console.WriteLine("                                                  ");

                // Barra de progreso.
                for (int i = 1; i <= Mitad_barra; i++)
                {
                    Console.Write("█"); // Muestra ASCII 219 Dec y DB en Hex.
                }

                // Si sobre pasa 100, muestra # al final de la barra del porcentaje de color rojo.
                if (Resultado_Porcentaje >= 100)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write("#");
                }

                Console.ForegroundColor = ConsoleColor.Gray; // Vuelve al color gris.

                // Línea 7.
                Console.SetCursorPosition(0, 7);
                Console.Write("Porcentaje: ");
                Console.SetCursorPosition(12, 7);
                Console.Write("            ");
                Console.SetCursorPosition(12, 7);
                Console.Write(Resultado_Porcentaje.ToString("N0") + " %.");

                // Línea 8.
                Console.SetCursorPosition(0, 8);
                Console.Write("Voltios: ");
                Console.SetCursorPosition(12, 8);
                Console.Write("            ");
                Console.SetCursorPosition(12, 8);
                Console.Write(Resultado_Voltios.ToString("N2") + " V.");

            }

            catch (FormatException)
            {
                // Console.WriteLine("La cadena de entrada no tiene el formato correcto.");
            }
        }
    }
}
 
Atrás
Arriba