none
Cuando se está enviado datos al puerto serie y un botón para interrumpir RRS feed

  • Pregunta

  • Hola:

    Tengo un archivo cargado en un arrray.

    byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.

    Envío los datos al puerto serie.

                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
    }

    El código de un botón del Windows Form es este.

    private void button_Grabar_Click(object sender, EventArgs e) { byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.

    for (int i = 0; i <= archivo.GetUpperBound(0); i++) { serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo. if ((i & 0xFF) == 0) { Application.DoEvents(); } } }


    Quiero crear otro botón que al pulsarlo, se detenga la operación, que de deje de enviar bytes y que diga en un mensaje:

    El proceso se ha cancelado.

    ¿Es posible hacerlo?

    Saludos.


    http://electronica-pic.blogspot.com

    viernes, 18 de agosto de 2017 23:36

Respuestas

  • Declara a nivel de Form una variable:

    bool interrumpir=false;

    Cambia la rutina de envío así:

    for (int i = 0; i <= archivo.GetUpperBound(0); i++)
    {
        serialPort1.Write(archivo, i, 1);
        Application.DoEvents();
        if (interrumpir) break;
    }

    Y añade un botón "Interrupir" que en su Click haga interrupir=true;

    Nota: El Application.DoEvents es importante, de lo contrario la aplicación no responderá a los clicks del otro botón. De esta menera, responderá entre medias de línea y línea (pero no puedes interrupmir una línea a medio transmitir). Si esto no es suficiente, entonces tendrás que recurrir a usar Threads.

    • Propuesto como respuesta Jorge TurradoMVP sábado, 19 de agosto de 2017 11:12
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:29
    sábado, 19 de agosto de 2017 7:46
  • mmm se me ocurre colocarlo dentro de un Thread y con thread.abort terminar el envío. Te dejo el link del thread a ver si te sirve

    https://msdn.microsoft.com/es-es/library/5b50fdsz(v=vs.110).aspx

    Lo que dudo es de la precisiión del aborto

    Saludos


    • Editado Marcelo PF sábado, 19 de agosto de 2017 4:19
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:29
    sábado, 19 de agosto de 2017 4:18
  • Si, perdona amigo estaba saliendo del trabajo aca el código traducido y funcional

     

    bool alto = false;

    private void TestDoEvents() { for (int i = 0; i <= 50000; i++) { textBox1.Text = Convert.ToString(i); Application.DoEvents(); if (alto == true) { alto = false; break; // TODO: might not be correct. Was : Exit For } } }


     private void button1_Click(object sender, EventArgs e)
            {
                if (button1.Text == "Arranque")
                {
                    button1.Text = "Cancelar";
                    TestDoEvents();
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button1.Text = "Arranque";
                    }
                }
            }
    Saludos


    • Editado Marcelo PF domingo, 20 de agosto de 2017 3:06
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:29
    domingo, 20 de agosto de 2017 3:04
  • Aquí te da error ?
    button_Cancelar.Text == "Arranque";
    Si es así debe estár más colocado  algún "} "  la idea es que quede fuera del for al final de la función, igualmente quitalo y prueba si funcióna utlizando Cancelar, para verificar el código si interrumpe como debe. Voy analizando ese error
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    domingo, 20 de agosto de 2017 21:38
  • Hasta me instalé un Virtual Serial Port ja, si funciona solo haz lo de la respuesta anterior

    Saludos

    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    lunes, 21 de agosto de 2017 4:37
  • Por fin, jaja fue un parto ja, bueno para el porciento no nos vamos a matar mucho regla de tres simple y ya No copies tal cual que yo tengo textbox en vez de label para el conteo

    fijate así

            int N = 0;
            int P = 0;
            int resul = 0;
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(@"C:Archivo a leer"); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
                N = archivo.Length - 1;
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
                    P = i;
                    resul = 100 * i / N;
                    progressBar_barrra_progreso.Value = i;
    
                    textBox1.Text = i.ToString() + " Bytes.";
                    label1.Text = resul + "%";
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
                button_Cancelar.Text = "Arranque";
    
            }

    N lee el archivo y -1 por la base 0 de todo array

    Me dices si funciona

    Saludos



    • Editado Marcelo PF lunes, 21 de agosto de 2017 16:10
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    lunes, 21 de agosto de 2017 16:07
  • Bueno, fijáte si así sirve creo que esta bueno, no lo copies tal cual por las dudas,

    int N = 0; int P = 0; int resul = 0; private void TestDoEvents() { byte[] archivo = File.ReadAllBytes(@"C:\Dirección del archivo"); // Carga el archivo en el array. progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo. N = archivo.Length - 1; for (int i = 0; i <= archivo.GetUpperBound(0); i++) { serialPort1.Write(archivo, i, 1); P = i; resul = 100 * i / N; progressBar_barrra_progreso.Value = i; Info.Items[0].Text = "Info: Grabando EEPROM.. " + resul +"%"; label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; label_Por_ciento.Text = resul + "%"; Application.DoEvents(); if (alto == true) { alto = false; break; // TODO: might not be correct. Was : Exit For } } if(button_Cancelar.Text == "Cancelar") { MessageBox.Show("Grabación finalizada.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information); Info.Items[0].Text = "Info: Envio finalizado, en espera del próximo proceso"; button_Cancelar.Text = "Arranque"; label_Bytes_transmitidos.Text = "0"; label_Por_ciento.Text = "0%"; progressBar_barrra_progreso.Value = 0; } button_Cancelar.Text = "Arranque"; } bool alto = false; private void button1_Click(object sender, EventArgs e) { if (button_Cancelar.Text == "Arranque") { DialogResult Res = MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (Res == DialogResult.OK) { button_Cancelar.Text = "Cancelar"; TestDoEvents(); } else //Fijate si no te falta esto y el return { return; } } else { if (alto == true) { alto = false; } else {

    DialogResult Res2 = MessageBox.Show("¿Deseas cancelar la operación?", "Aviso",MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (Res2 == DialogResult.Yes) //Aca para no confundir colocar con formato Si No "MessageBOxButtons.YesNo," { alto = true; button_Cancelar.Text = "Arranque"; label_Bytes_transmitidos.Text = "0"; label_Por_ciento.Text = "0%"; progressBar_barrra_progreso.Value = 0; Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso"; } } } } }

    Mi menuStrip es Info el item = 0 uso solo ese para cambiarle el texto, coloque el porciento también en él.

    Cerveza negra en lo posible ja, te propongo ir eliminado las respuestas que no sean de impotancia por el peso del post

    Saludos




    • Editado Marcelo PF martes, 22 de agosto de 2017 12:46
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    martes, 22 de agosto de 2017 3:59
  • Amigo me estas matando... ahora tu código incuye el boton Grabar??? no entiendo si lo habiamos excluido por el  botón cancelar (Arrancar) y alli iba todo el código.. mira te paso el código, quita el código del botón Grabar  y arranquemos de 0 que nos vamos al pasto jajajaj

     int N = 0;
            int P = 0;
            int resul = 0;
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(@"C:\Directoriosdel text"); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
                N = archivo.Length - 1;
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    
                    serialPort1.Write(archivo, i, 1);
                    P = i;
                    resul = 100 * i / N;
                    progressBar_barrra_progreso.Value = i;
                    statusStrip_Info.Items[0].Text = "Info: Grabando EEPROM..  " + resul +"%";
    
                label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
                    label_Por_ciento.Text = resul + "%";
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
    
                if(button_Cancelar.Text == "Cancelar")
                {
                    MessageBox.Show("Grabación finalizada.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    statusStrip_Info.Items[0].Text = "Info: Envio finalizado, en espera del próximo proceso";
                    button_Cancelar.Text = "Arranque";
                    label_Bytes_transmitidos.Text = "0";
                    label_Por_ciento.Text = "0%";
                    progressBar_barrra_progreso.Value = 0;
                }
    
               
                button_Cancelar.Text = "Arranque";
            }
            
    
            bool alto = false;
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    DialogResult Res = MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (Res == DialogResult.OK)
                    {
                        button_Cancelar.Text = "Cancelar";
                        TestDoEvents();
                    }
                    else
                    {
                        return;
                    }
    
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        
                        
                            alto = true;
                            button_Cancelar.Text = "Arranque";
                            label_Bytes_transmitidos.Text = "0";
                            label_Por_ciento.Text = "0%";
                            progressBar_barrra_progreso.Value = 0;
                        statusStrip_Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso";
                        
                    }
                }
            }

    Fijate cambiar en la busqueda del archivo por tu textbox Solo se usa el botón "Arrancar" quite el messagebox de  cancelar, otra cosa si quieres preguntar al cerrar estamos en la misma, pausará hasta responder estoy viento otras opciones , tal vez "fabricar" un botón de salida y allí enviar algún tipo de mensage que no sea un messengerbox

    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    martes, 22 de agosto de 2017 16:30
  • Bueno, no se yo colocaría tambien serialPoirt.Close (); dentro de las instrucciónes Cancelar(); como última, por lo que creo el valor alto= true; hace que finalize pero no esta demás cerrar el puerto, tu te fijas, creo que está hecho, si mi ayuda te sirvió votala como tal ....bla bla bla ja

    Saludos amigo
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:31
    martes, 22 de agosto de 2017 23:08

Todas las respuestas

  • mmm se me ocurre colocarlo dentro de un Thread y con thread.abort terminar el envío. Te dejo el link del thread a ver si te sirve

    https://msdn.microsoft.com/es-es/library/5b50fdsz(v=vs.110).aspx

    Lo que dudo es de la precisiión del aborto

    Saludos


    • Editado Marcelo PF sábado, 19 de agosto de 2017 4:19
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:29
    sábado, 19 de agosto de 2017 4:18
  • Declara a nivel de Form una variable:

    bool interrumpir=false;

    Cambia la rutina de envío así:

    for (int i = 0; i <= archivo.GetUpperBound(0); i++)
    {
        serialPort1.Write(archivo, i, 1);
        Application.DoEvents();
        if (interrumpir) break;
    }

    Y añade un botón "Interrupir" que en su Click haga interrupir=true;

    Nota: El Application.DoEvents es importante, de lo contrario la aplicación no responderá a los clicks del otro botón. De esta menera, responderá entre medias de línea y línea (pero no puedes interrupmir una línea a medio transmitir). Si esto no es suficiente, entonces tendrás que recurrir a usar Threads.

    • Propuesto como respuesta Jorge TurradoMVP sábado, 19 de agosto de 2017 11:12
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:29
    sábado, 19 de agosto de 2017 7:46

  • Usualmente existen dos métodos de verificación:
    • Comprobar igualdad entre el byte ingresado y recuperado: Es una verificación que se hace "al vuelo" de la escritura. La IDE de Arduino utiliza este método para verificar el programa a subir (nótese que es por algo que ambos LEDs TX y RX se encienden durante este proceso).
    • Verificación post-proceso: como el nombre lo dice, es grabar e inmediatamente realizar un proceso de lectura. Al final también es comparar contenido en la fuente y destino, generando un código hash. Si estos códigos coinciden, todo bien; caso contrario algo salió mal durante la grabación.

    Para efectos de este proyecto, sugeriría que el método de verificación sea el segundo. La lectura de esas EEPROM es a nivel de bytes, pero la escritura es a nivel de bloques (de 64 bytes); el sobrecargo sería enorme si se intenta verificar "al vuelo".

    http://electronica-pic.blogspot.com

    sábado, 19 de agosto de 2017 15:04
  • Hola de nuevo:

    hice un ejemplo. Si pulso el botón Cancelar a la primera, no se detiene,ni a la segunda, si a la tercera cuando le doy clic.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
             bool interrumpir = false;
    
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                //for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                //{
                //    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
                //    progressBar_barrra_progreso.Value = i; // Muestra el conteo de la barra de progreso.
                //    label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; // Cantidad de Bytes transmitidos.
    
                //    if ((i & 0xFF) == 0)
                //    {
                //        Application.DoEvents();
                //    }
                //}
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
                    progressBar_barrra_progreso.Value = i;
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
                    Application.DoEvents();
                    if (interrumpir) break;
                }
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                interrumpir = true;
            }
        }
    }

    Esa es mi experiencia. La idea es que a la primera que haces clic al botón Cancelar, se interrumpa el proceso, no a la tercera vez. ;)

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 19 de agosto de 2017 19:17
  • Para probar ponlo al principio del for
    sábado, 19 de agosto de 2017 20:45
  • Para probar ponlo al principio del for

    ¿El qué?

    http://electronica-pic.blogspot.com

    sábado, 19 de agosto de 2017 22:23
  • lo que te decía que if (interrumpir) break; lo colocaras al principio del For, pero da igual, estúve probando con un contador de 0 50000 en un textbox y me daba el mismo error solo que en dos tiempos, supongo que debe ser algo referido a Aplications.DoEvent. pero.. intenté colocar todo en un solo botón, o sea el disparo la carga y una vez dado el click se transforma en el botón Cancelar y allí para al momento.

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If Button1.Text = "Arranque" Then
                Button1.Text = "Cancelar"
                TestDoEvents()
            Else
                If alto = True Then
                    alto = False
                Else
                    alto = True
                    Button1.Text = "Arranque"
                End If
            End If
        End Sub
        Private Sub TestDoEvents()
            For i As Integer = 0 To 50000
                TextBox1.Text = i.ToString
                My.Application.DoEvents()
                If alto = True Then
                    alto = False
                    Exit For
                End If
            Next
        End Sub

    Este es el ejemplo, que utilizé para comprobar, el Button1 en un principio con text "Arranque" en este caso

    está en vb pero no te será dificil. alto es el bool tu interrumpir

    Si te complica más de lo que te ayuda ni caso me hagas ja saludos




    • Editado Marcelo PF sábado, 19 de agosto de 2017 23:48
    sábado, 19 de agosto de 2017 22:40
  • Hola:

    Convertido de VB .net a C# me da estos resultados.

    http://converter.telerik.com/

    private void Button1_Click(System.Object sender, System.EventArgs e)
    {
    	if (Button1.Text == "Arranque") {
    		Button1.Text = "Cancelar";
    		TestDoEvents();
    	} else {
    		if (alto == true) {
    			alto = false;
    		} else {
    			alto = true;
    			Button1.Text = "Arranque";
    		}
    	}
    }

    Este otro.

    private void TestDoEvents()
    {
    	for (int i = 0; i <= 50000; i++) {
    		TextBox1.Text = i.ToString;
    		My.Application.DoEvents();
    		if (alto == true) {
    			alto = false;
    			break; // TODO: might not be correct. Was : Exit For
    		}
    	}
    }

    Lo probaré y te cuento.

    Gracias.


    http://electronica-pic.blogspot.com

    domingo, 20 de agosto de 2017 2:30
  • Si, perdona amigo estaba saliendo del trabajo aca el código traducido y funcional

     

    bool alto = false;

    private void TestDoEvents() { for (int i = 0; i <= 50000; i++) { textBox1.Text = Convert.ToString(i); Application.DoEvents(); if (alto == true) { alto = false; break; // TODO: might not be correct. Was : Exit For } } }


     private void button1_Click(object sender, EventArgs e)
            {
                if (button1.Text == "Arranque")
                {
                    button1.Text = "Cancelar";
                    TestDoEvents();
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button1.Text = "Arranque";
                    }
                }
            }
    Saludos


    • Editado Marcelo PF domingo, 20 de agosto de 2017 3:06
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:29
    domingo, 20 de agosto de 2017 3:04
  • Hola;

    Te enseño todo el código, pero no entiendo la parte esta del.

    textBox1.Text = Convert.ToString(i);

    Código completo.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                //for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                //{
                //    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
                //    progressBar_barrra_progreso.Value = i; // Muestra el conteo de la barra de progreso.
                //    label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; // Cantidad de Bytes transmitidos.
    
                //    if ((i & 0xFF) == 0)
                //    {
                //        Application.DoEvents();
                //    }
                //}
            }
    
    
            bool alto = false;
            private void TestDoEvents()
            {
                for (int i = 0; i <= 50000; i++)
                {
                    textBox1.Text = Convert.ToString(i);
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    button1.Text = "Cancelar";
                    TestDoEvents();
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button_Cancelar.Text = "Arranque";
                    }
                }
            }
        }
    }
    Por supuesto, da error en la parte que te dije no entiendo.
    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 20 de agosto de 2017 13:26
  • No no, lo que te di es un ejemplo para que reemplazaras tu botón grabar, y colocaras en una función el resto del código, fijate si así va

     bool alto = false;
    
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
    
                    progressBar_barrra_progreso.Value = i;
    
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
            }
            private void button2_Click(object sender, EventArgs e) //aquí lo combias por tu button "button_Grabar_Click"
            {
                if (button2.Text == "Arranque")
                {
                    button2.Text = "Cancelar";
                    TestDoEvents();
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button2.Text = "Arranque";
                    }
                }
            }

    Se entiende? el botón button2 (en mi caso ) dispara el evento TestDoEnvent() que está encerrado tu codigo de carga de byte y el mismo boton luego de click se conviete en el botón "Cancelar" con el que interrumpes el evento y por ende la carga de bytes

    prueba y me dices

    Saludos

    domingo, 20 de agosto de 2017 16:20
  • Buenas:

    Te lo ejecuta pero el comportamiento es un desastre.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                //for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                //{
                //    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
                //    progressBar_barrra_progreso.Value = i; // Muestra el conteo de la barra de progreso.
                //    label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; // Cantidad de Bytes transmitidos.
    
                //    if ((i & 0xFF) == 0)
                //    {
                //        Application.DoEvents();
                //    }
                //}
            }
    
    
            bool alto = false;
    
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
    
                    progressBar_barrra_progreso.Value = i;
    
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    button1.Text = "Cancelar";
                    TestDoEvents();
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button_Cancelar.Text = "Arranque";
                    }
                }
            }
        }
    }

    Pulsa el botón, no hace nada, pulso otra vez si lo hace, envia archivos, pulso otra vez, se pone a 0 y vuelve a enviar.....

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 20 de agosto de 2017 19:24
  •  1_ Al button cancelar colocaste en su propiedad text "Arranque" ?

    • Editado Marcelo PF domingo, 20 de agosto de 2017 20:46
    domingo, 20 de agosto de 2017 19:43
  • 2_ Lo que le llevo a pensar que si no se efectua Cancelar el button quedara con el text "Cancelar" para esto en la función TestDoEnvents() luego de la instrucción  for  colocar button_Cancelar.Text = "Arranque" así retomara su string original

    private void TestDoEvents() { byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array. progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo. for (int i = 0; i <= archivo.GetUpperBound(0); i++) { serialPort1.Write(archivo, i, 1); progressBar_barrra_progreso.Value = i; label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; Application.DoEvents(); if (alto == true) { alto = false; break; // TODO: might not be correct. Was : Exit For } } button_Cancelar.Text == "Arranque";

    }

    Saludos




    • Editado Marcelo PF domingo, 20 de agosto de 2017 21:10
    domingo, 20 de agosto de 2017 20:30
  • Da error.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                //for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                //{
                //    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
                //    progressBar_barrra_progreso.Value = i; // Muestra el conteo de la barra de progreso.
                //    label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; // Cantidad de Bytes transmitidos.
    
                //    if ((i & 0xFF) == 0)
                //    {
                //        Application.DoEvents();
                //    }
                //}
            }
    
    
            bool alto = false;
    
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
    
                    progressBar_barrra_progreso.Value = i;
    
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
                button_Cancelar.Text == "Arranque";
    
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    button1.Text = "Cancelar";
                    TestDoEvents();
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button_Cancelar.Text = "Arranque";
                    }
                }
            }
        }
    }

    Gravedad    Código    Descripción    Proyecto    Archivo    Línea    Estado suprimido
    Error    CS0201    Solo las expresiones de asignación, llamada, incremento, decremento y objeto nuevo se pueden usar como instrucción    EEPROM_Prueba_cs    C:\Users\Usuario\Documents\Visual Studio 2017\Projects\EEPROM_Prueba_cs\EEPROM_Prueba_cs\Form1.cs    116    Activo


    http://electronica-pic.blogspot.com

    domingo, 20 de agosto de 2017 21:25
  • Aquí te da error ?
    button_Cancelar.Text == "Arranque";
    Si es así debe estár más colocado  algún "} "  la idea es que quede fuera del for al final de la función, igualmente quitalo y prueba si funcióna utlizando Cancelar, para verificar el código si interrumpe como debe. Voy analizando ese error
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    domingo, 20 de agosto de 2017 21:38
  • Mil disculpas error mio de copiar y pegar Button_Cancelar.Text = "Arranque"; Un solo "=" ya que no estóy operando nada.

    Saludos


    • Editado Marcelo PF domingo, 20 de agosto de 2017 22:44
    domingo, 20 de agosto de 2017 22:43
  • Hola:

    Ejecuta pero hace cosas raras, nunca se detiene, si lo intentas detener, reinicia y envía otra vez. A parte de eso, hay que darle una segunda vez para que arranque.

    Dejo el proyecto en DropBox.

    Descargar.

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 20 de agosto de 2017 23:02
  • bien, eso debe ser los if  en la función, lo voy a verificar
    domingo, 20 de agosto de 2017 23:12
  • Meta, el el designer me sale que tienes " this.button_Cancelar.Text = "Cancelar";" debe tener el Text "Arranque" ve a diseño click ne el button_Cancelar y en la propiedad Text coloca Arranque
    • Editado Marcelo PF domingo, 20 de agosto de 2017 23:22
    domingo, 20 de agosto de 2017 23:22
  • Hasta me instalé un Virtual Serial Port ja, si funciona solo haz lo de la respuesta anterior

    Saludos

    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    lunes, 21 de agosto de 2017 4:37
  • Ya funciona todo al 99.9 %, ajjajaj ajjajaja. Por fin.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                //for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                //{
                //    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
                //    progressBar_barrra_progreso.Value = i; // Muestra el conteo de la barra de progreso.
                //    label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; // Cantidad de Bytes transmitidos.
    
                //    if ((i & 0xFF) == 0)
                //    {
                //        Application.DoEvents();
                //    }
                //}
            }
    
    
            bool alto = false;
    
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
    
                    progressBar_barrra_progreso.Value = i;
    
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
                button_Cancelar.Text = "Arranque";
    
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    button_Cancelar.Text = "Cancelar";
                    TestDoEvents();
                    progressBar_barrra_progreso.Value = 0; // Resetear progressBar a 0.
                    label_Bytes_transmitidos.Text = "0";
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button_Cancelar.Text = "Arranque";
                    }
                }
            }
        }
    }

    Estaba selañado en button_Leer.

    Por cierto, puse un lebel llamado label_Por_ciento. Tiene que indicar en la barra de progreso del 0 al 100 %.

    Por lo que estoy leyendo aquí.
    https://msdn.microsoft.com/es-es/library/ka89zff4(v=vs.110).aspx

    He intentado hacerlo así.

    label_Por_ciento.Text = ((progressBar_barrra_progreso.Value / archivo.Count()) * 100).ToString() + "%";

    Pero no me sale.


    http://electronica-pic.blogspot.com

    lunes, 21 de agosto de 2017 9:18
  • Por fin, jaja fue un parto ja, bueno para el porciento no nos vamos a matar mucho regla de tres simple y ya No copies tal cual que yo tengo textbox en vez de label para el conteo

    fijate así

            int N = 0;
            int P = 0;
            int resul = 0;
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(@"C:Archivo a leer"); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
                N = archivo.Length - 1;
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    serialPort1.Write(archivo, i, 1);
                    P = i;
                    resul = 100 * i / N;
                    progressBar_barrra_progreso.Value = i;
    
                    textBox1.Text = i.ToString() + " Bytes.";
                    label1.Text = resul + "%";
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
                button_Cancelar.Text = "Arranque";
    
            }

    N lee el archivo y -1 por la base 0 de todo array

    Me dices si funciona

    Saludos



    • Editado Marcelo PF lunes, 21 de agosto de 2017 16:10
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    lunes, 21 de agosto de 2017 16:07
  • Buenas:

    Vamos avanzando. Falta detallitos. Por ejemplo, ya funciona y por fiiiiiiiiiiiiiiiiiiiiiiiiiiiiin el porcentaje. Espero que no tenga errores en los comentarios que puse, jaajjajaja.

            // Variables.
            bool alto = false;
            int N = 0;
            int P = 0;
            int resul = 0;
    
            private void TestDoEvents()
            {
                // Carga el archivo en el array.
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
    
                // Hasta donde llegue el tamaño del archivo.
                progressBar_barrra_progreso.Maximum = archivo.Length;
    
                // Guarda la cantidad de Bytes del archivo en la variable.
                N = archivo.Length - 1; 
    
                // Transmite byte en byte los datos del archivo al puerto serie.
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    // Enviando archivo al puerto serie.
                    serialPort1.Write(archivo, i, 1);
                    
                    // Números de Bytes.
                    P = i;
                    
                    // Resultado de la regla de tres. Cálculo del porcentaje de la barra de progreso.
                    resul = 100 * i / N;
                    
                    // Muestra barra del progreso.
                    progressBar_barrra_progreso.Value = i;
    
                    // Muestra la cantidad de Bytes enviados.
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    // Muestra la cantidad en porciento archivo enviado.
                    label_Por_ciento.Text = resul + " %";
    
                    // Evento de cancelación.
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
                button_Cancelar.Text = "Arranque";
            }

    Cuando llega a 100 % se queda en 100 %, la cantidad de Bytes y la barra verde vuelve a 0.

    Lo ideal sería que, cuando llegue a 100 %, se quede el máximo de Bytes y la barra de progreso en verde.

    Después te salta un mensaje que abre una ventana con MessageBox.Show y dice:

    Desde que pulse el botón Arranque.

            private void MensajeBox()
            {
                MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", 
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            }

    En el procesado de grabación de EEPROM o envío de archivo.

            private void MensajesStatusStrip()
            {
                statusStrip1.Items[0].Text = "Grabando EEPROM...";
            }

    Cuando llega al final de la grabación o envío de datos.

            private void MensajeBox_Finalizado()
            {
                MessageBox.Show("Grabación finalizada.", "Aviso",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

    Si en el momento está enviando archivo, o lo que es lo mismo, grabando la EEPROM. Pulsas el botón Cancelar. Te sale un mensaje:

            private void MensajeBox_Cancelar()
            {
                MessageBox.Show("¿Deseas cancelar la operación?", "Aviso",
        MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            }

    No olvidar que al cerrar el formulario, también prgunta si redeas cancelar el dispositivo EEPROM, si pulsas si, cancela y cerra el Form, si respondes no, sigues en el formulario grabando la eeprom o enviando archivo.

    Código completo pero sin llamadas a las funciones de mensajes porque no se la forma más adecuada donde ponerlo. ;)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
    
                //for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                //{
                //    serialPort1.Write(archivo, i, 1); // Envía al puerto el archivo.
                //    progressBar_barrra_progreso.Value = i; // Muestra el conteo de la barra de progreso.
                //    label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; // Cantidad de Bytes transmitidos.
    
                //    if ((i & 0xFF) == 0)
                //    {
                //        Application.DoEvents();
                //    }
                //}
            }
    
            // Variables.
            bool alto = false;
            int N = 0;
            int P = 0;
            int resul = 0;
    
            private void TestDoEvents()
            {
                // Carga el archivo en el array.
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
    
                // Hasta donde llegue el tamaño del archivo.
                progressBar_barrra_progreso.Maximum = archivo.Length;
    
                // Guarda la cantidad de Bytes del archivo en la variable.
                N = archivo.Length - 1; 
    
                // Transmite byte en byte los datos del archivo al puerto serie.
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    // Enviando archivo al puerto serie.
                    serialPort1.Write(archivo, i, 1);
                    
                    // Números de Bytes.
                    P = i;
                    
                    // Resultado de la regla de tres. Cálculo del porcentaje de la barra de progreso.
                    resul = 100 * i / N;
                    
                    // Muestra barra del progreso.
                    progressBar_barrra_progreso.Value = i;
    
                    // Muestra la cantidad de Bytes enviados.
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    // Muestra la cantidad en porciento archivo enviado.
                    label_Por_ciento.Text = resul + " %";
    
                    // Evento de cancelación.
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
                button_Cancelar.Text = "Arranque";
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    button_Cancelar.Text = "Cancelar";
                    TestDoEvents();
                    progressBar_barrra_progreso.Value = 0; // Resetear progressBar a 0.
                    label_Bytes_transmitidos.Text = "0";
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        alto = true;
                        button_Cancelar.Text = "Arranque";
                    }
                }
            }
    
            // Cuando pulsas el botón de arranque.
            private void MensajeBox_Aviso()
            {
                MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", 
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            }
    
            // Cuando está grabando o enviando archivo.
            private void Mensajes_StatusStrip_Grabando()
            {
                statusStrip1.Items[0].Text = "Grabando EEPROM...";
            }
    
            // Cuando el envío del archivo ha acabado de completar.
            private void MensajeBox_Finalizado()
            {
                MessageBox.Show("Grabación finalizada.", "Información",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
    
            // Pregunta si haz pulzado el botón "Cancelar".
            private void MensajeBox_Cancelar()
            {
                MessageBox.Show("¿Deseas cancelar la operación?", "Aviso",
        MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            }
    
            // Cuando pulse el botón "Cancelar" en el momento que digas "Sí" o "Ok".
            private void Mensajes_StatusStrip_Cancelado()
            {
                statusStrip1.Items[0].Text = "Grabación cancelada.";
            }
        }
    }

    Ufffffffffffff, si que es duro esto.

    Saludos.


    http://electronica-pic.blogspot.com



    • Editado Metaconta lunes, 21 de agosto de 2017 22:46
    lunes, 21 de agosto de 2017 22:33
  • Bueno, fijáte si así sirve creo que esta bueno, no lo copies tal cual por las dudas,

    int N = 0; int P = 0; int resul = 0; private void TestDoEvents() { byte[] archivo = File.ReadAllBytes(@"C:\Dirección del archivo"); // Carga el archivo en el array. progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo. N = archivo.Length - 1; for (int i = 0; i <= archivo.GetUpperBound(0); i++) { serialPort1.Write(archivo, i, 1); P = i; resul = 100 * i / N; progressBar_barrra_progreso.Value = i; Info.Items[0].Text = "Info: Grabando EEPROM.. " + resul +"%"; label_Bytes_transmitidos.Text = i.ToString() + " Bytes."; label_Por_ciento.Text = resul + "%"; Application.DoEvents(); if (alto == true) { alto = false; break; // TODO: might not be correct. Was : Exit For } } if(button_Cancelar.Text == "Cancelar") { MessageBox.Show("Grabación finalizada.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information); Info.Items[0].Text = "Info: Envio finalizado, en espera del próximo proceso"; button_Cancelar.Text = "Arranque"; label_Bytes_transmitidos.Text = "0"; label_Por_ciento.Text = "0%"; progressBar_barrra_progreso.Value = 0; } button_Cancelar.Text = "Arranque"; } bool alto = false; private void button1_Click(object sender, EventArgs e) { if (button_Cancelar.Text == "Arranque") { DialogResult Res = MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (Res == DialogResult.OK) { button_Cancelar.Text = "Cancelar"; TestDoEvents(); } else //Fijate si no te falta esto y el return { return; } } else { if (alto == true) { alto = false; } else {

    DialogResult Res2 = MessageBox.Show("¿Deseas cancelar la operación?", "Aviso",MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (Res2 == DialogResult.Yes) //Aca para no confundir colocar con formato Si No "MessageBOxButtons.YesNo," { alto = true; button_Cancelar.Text = "Arranque"; label_Bytes_transmitidos.Text = "0"; label_Por_ciento.Text = "0%"; progressBar_barrra_progreso.Value = 0; Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso"; } } } } }

    Mi menuStrip es Info el item = 0 uso solo ese para cambiarle el texto, coloque el porciento también en él.

    Cerveza negra en lo posible ja, te propongo ir eliminado las respuestas que no sean de impotancia por el peso del post

    Saludos




    • Editado Marcelo PF martes, 22 de agosto de 2017 12:46
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    martes, 22 de agosto de 2017 3:59
  • Buenas:

    Va tomando forma. Hay dos cosas, un error y el otro comportamiento no deseado.

    Cuando le des arrancar, pregunta si deseo grabar el dispositivo.

    1. Si pulso ACEPTAR, todo bien, se pone a grabar. Si pulso CANCELAR, es como si pulsara ACEPTAR, se pone a grabar cuando no debería hacer nada. ;)

    2. Cuando ya está grabando y el porcentaje contando. Si decido pulsar cancelar, se me detiene la operación como en PAUSA. En ese momento me dice que ACEPTAR o CANCELAR. Cuando salga el mensaje, en ningún momento debe ponerse en pausa dicha operación. Si le doy ACEPTAR, cancela la operación y vuelve todo a 0, porcentaje y números de Bytes. Si pulso CANCELAR, no pasa nada, todo sigue igual.

    Al cerrar el formulario, debe preguntar si decido cancelar en el momento que estoy grabando, si le doy ACEPTAR  cancela y salgo. Si pulso CANCELAR, se queda como está todo.

    Gracias.


    http://electronica-pic.blogspot.com

    martes, 22 de agosto de 2017 8:17
  • Buenas,

    1. Cancelar Arranque:  No me sucede verifica el código, fijate que tiene un "else" y un  "return" luego de el arranque que de ser cancelar no pasa nada

    2. Pausa: Es natural porque invocas un messangerbox y este comando pausa toda aplicación hasta recibir confirmación, habrá que evaluar

    3- El mensage dice "Desea cancelar la operación!" (lo que tu pusiste), la logica indica que si ascptas cancelas y si cancelas sigue el curso del programa. Se podria colocar "SI NO en el mesage para no confundir

    4 Si en la opción cancelar sigue la marcha probablemenete sea por  el return no colocado, dicho al principio

    5 Lo utilimo no lo entendí , dices que si se quiere cerrar el programa debe preguntar en caso de que esté grabando? habría que evaluar en el closing  programa si acepta el evento supongo que sí

    Revisa bien el código ahora lo edito para que veas donde puede ser la falla

    martes, 22 de agosto de 2017 12:33
  • Buenas:

    Te paso el código completo por si acaso.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
            }
    
            // Variables.
            bool alto = false;
            int N = 0;
            int P = 0;
            int resultado = 0;
    
            private void TestDoEvents()
            {
                // Carga el archivo en el array.
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
    
                // Hasta donde llegue el tamaño del archivo.
                progressBar_barrra_progreso.Maximum = archivo.Length;
    
                // Guarda la cantidad de Bytes del archivo en la variable.
                N = archivo.Length -1; 
    
                // Transmite byte en byte los datos del archivo al puerto serie.
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    // Enviando archivo al puerto serie.
                    serialPort1.Write(archivo, i, 1);
                    
                    // Números de Bytes.
                    P = i;
                    
                    // Resultado de la regla de tres. Cálculo del porcentaje de la barra de progreso.
                    resultado = ((100 * i) / N);
                    
                    // Muestra barra del progreso.
                    progressBar_barrra_progreso.Value = i;
    
                    // Mostrar mensaje.
                    statusStrip_Info.Items[0].Text = "Info: Grabando EEPROM..  " + resultado + "%";
    
                    // Muestra la cantidad de Bytes enviados.
                    label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
    
                    // Muestra la cantidad en porciento archivo enviado.
                    label_Por_ciento.Text = resultado + " %";
    
                    // Evento de cancelación.
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
    
                if (button_Cancelar.Text == "Cancelar")
                {
                    MessageBox.Show("Grabación finalizada.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    statusStrip_Info.Items[0].Text = "Info: Envio finalizado, en espera del próximo proceso";
                    button_Cancelar.Text = "Arranque";
                    label_Bytes_transmitidos.Text = "0";
                    label_Por_ciento.Text = "0%";
                    progressBar_barrra_progreso.Value = 0;
                }
    
                button_Cancelar.Text = "Arranque";
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    DialogResult Res = MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (Res == DialogResult.OK)
                        button_Cancelar.Text = "Cancelar";
                    TestDoEvents();
                    progressBar_barrra_progreso.Value = 0; // Resetear progressBar a 0.
                    label_Bytes_transmitidos.Text = "0";
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        DialogResult Res2 = MessageBox.Show("¿Deseas cancelar la operación?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                        if (Res2 == DialogResult.OK)
                        {
                            alto = true;
                            button_Cancelar.Text = "Arranque";
                            label_Bytes_transmitidos.Text = "0";
                            label_Por_ciento.Text = "0%";
                            progressBar_barrra_progreso.Value = 0;
                            statusStrip_Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso";
                        }
                    }
                }
            }
    
            // Cuando pulsas el botón de arranque.
            private void MensajeBox_Aviso()
            {
                MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", 
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            }
    
            // Cuando está grabando o enviando archivo.
            private void Mensajes_StatusStrip_Grabando()
            {
                statusStrip_Info.Items[0].Text = "Grabando EEPROM...";
            }
    
            // Cuando el envío del archivo ha acabado de completar.
            private void MensajeBox_Finalizado()
            {
                MessageBox.Show("Grabación finalizada.", "Información",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
    
            // Pregunta si haz pulzado el botón "Cancelar".
            private void MensajeBox_Cancelar()
            {
                MessageBox.Show("¿Deseas cancelar la operación?", "Aviso",
        MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            }
    
            // Cuando pulse el botón "Cancelar" en el momento que digas "Sí" o "Ok".
            private void Mensajes_StatusStrip_Cancelado()
            {
                statusStrip_Info.Items[0].Text = "Grabación cancelada.";
            }
        }
    }

    Por lo que estoy viendo hay que hacer cambios. Si pulsas "Cancelar", simplemente cancelas sin preguntar. Mejor esto que dejarlo en pausa. Con las EEPROM no se juega así. ;)

    En cuanto al último punto, el 5), quizás no me expresé bien.

    ¿Vez el dibujo de abajo con los botones minimizar, maximizar y salir de la X en cuadro rojo?

    Lo que estaba comentando es que si pulsas salir o esa X, en el momento que estés grabando la EEPROM o enviando el archivo, debe preguntar si vas a salir. En ningún momento debe ponerse en pausa enviando archivo.

    Cuando acabemos estos detallitos, iba a preguntarte algo si se puede hacer y no lo se. ;) Esto será creando otro tema o hilo.

    Muchas gracias.


    http://electronica-pic.blogspot.com



    • Editado Metaconta martes, 22 de agosto de 2017 14:47
    martes, 22 de agosto de 2017 13:27
  • Amigo me estas matando... ahora tu código incuye el boton Grabar??? no entiendo si lo habiamos excluido por el  botón cancelar (Arrancar) y alli iba todo el código.. mira te paso el código, quita el código del botón Grabar  y arranquemos de 0 que nos vamos al pasto jajajaj

     int N = 0;
            int P = 0;
            int resul = 0;
            private void TestDoEvents()
            {
                byte[] archivo = File.ReadAllBytes(@"C:\Directoriosdel text"); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
                N = archivo.Length - 1;
    
                for (int i = 0; i <= archivo.GetUpperBound(0); i++)
                {
                    
                    serialPort1.Write(archivo, i, 1);
                    P = i;
                    resul = 100 * i / N;
                    progressBar_barrra_progreso.Value = i;
                    statusStrip_Info.Items[0].Text = "Info: Grabando EEPROM..  " + resul +"%";
    
                label_Bytes_transmitidos.Text = i.ToString() + " Bytes.";
                    label_Por_ciento.Text = resul + "%";
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
    
                if(button_Cancelar.Text == "Cancelar")
                {
                    MessageBox.Show("Grabación finalizada.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    statusStrip_Info.Items[0].Text = "Info: Envio finalizado, en espera del próximo proceso";
                    button_Cancelar.Text = "Arranque";
                    label_Bytes_transmitidos.Text = "0";
                    label_Por_ciento.Text = "0%";
                    progressBar_barrra_progreso.Value = 0;
                }
    
               
                button_Cancelar.Text = "Arranque";
            }
            
    
            bool alto = false;
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    DialogResult Res = MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (Res == DialogResult.OK)
                    {
                        button_Cancelar.Text = "Cancelar";
                        TestDoEvents();
                    }
                    else
                    {
                        return;
                    }
    
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        
                        
                            alto = true;
                            button_Cancelar.Text = "Arranque";
                            label_Bytes_transmitidos.Text = "0";
                            label_Por_ciento.Text = "0%";
                            progressBar_barrra_progreso.Value = 0;
                        statusStrip_Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso";
                        
                    }
                }
            }

    Fijate cambiar en la busqueda del archivo por tu textbox Solo se usa el botón "Arrancar" quite el messagebox de  cancelar, otra cosa si quieres preguntar al cerrar estamos en la misma, pausará hasta responder estoy viento otras opciones , tal vez "fabricar" un botón de salida y allí enviar algún tipo de mensage que no sea un messengerbox

    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:30
    martes, 22 de agosto de 2017 16:30
  • Hola:

    Si sabes otr mensaje de salida sin usar MessageBox, puedes decir como es.

    En cuanto el botón de Grabar que ya he quitado, lleva ahí desde el principio sin usarse, ajajjajaj ajaj aj aj ajajaj.

    El programa funciona todo bien menos una cosa que no se ha programado. En el momento que estás grabando, si pulsar salir del formulario aparece errror puerto cerrado.

    System.InvalidOperationException: 'El puerto está cerrado.'

    Te señala aquí.a

                    // Enviando archivo al puerto serie.
                    serialPort1.Write(archivo, i, 1);
    Lo que tiene que hacer, es cancelar la operación y luego el formulario cierra.

    Saludos.


    http://electronica-pic.blogspot.com

    martes, 22 de agosto de 2017 20:02
  • El error de seiral Port también se produce si pulsas varias veces seguidas arranque y parada, desconosco el origen de por qué, allí no te puedo ayudar se cierra el puerto, tal vez una condición de seguridad, desconosco.

     Sigo buscando una solución para cerrar el formulario

    Saludos

    martes, 22 de agosto de 2017 21:19
  • Hola:

    Lo de arranque cancelar no me da problemas porue sale el mensaje MessageBox.Show. Esto está bien.

    Cuando cierras el formulario mientra estás grabando, te da error porque en ese momento estás usando el puerto. Si sales del formulario pulsando la X, hay que darle una orden de CANCELAR para detener el proceso, luego sale.

    Saludos.


    http://electronica-pic.blogspot.com

    martes, 22 de agosto de 2017 21:29
  • Ah bueno, es facil  en el evento clousing colocamos

       Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            SerialPort1.Close();
        End Sub

    Servirá así? no lo puedo probar aca Trab...


    • Editado Marcelo PF martes, 22 de agosto de 2017 22:27
    martes, 22 de agosto de 2017 22:17
  • Si, si

    https://msdn.microsoft.com/es-es/library/system.io.ports.serialport.close(v=vs.110).aspx

    "

    SerialPort objeto y borra tanto la recepción y búferes de transmisión..Dispose() method, which invokes the protected SerialPort.Dispose(Boolean) method with the disposing parameter set to true." id="mt7"> Este método llama a la Component.Dispose() método que invoca el protegido SerialPort.Dispose(Boolean) método con el disposing establecido en true.

    Open método, como el puerto no se puede cerrar al instante."

    martes, 22 de agosto de 2017 22:28
  • Ya lo averigué.

    Creé estas intrucciones dentro de una función.

            private void Cancelar()
            {
                alto = true;
                button_Cancelar.Text = "Arranque";
                label_Bytes_transmitidos.Text = "0";
                label_Por_ciento.Text = "0%";
                progressBar_barrra_progreso.Value = 0;
                statusStrip_Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso";
            }

    Ahora cierra sin ningún error y sin avisar de que hay que cancelar, ajajajajajjja, pero cierra.

            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                Cancelar();
            }


    Código completo:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace EEPROM_Prueba_cs
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // Abrir puerto mientra se ejecute la aplicación.
                if (!serialPort1.IsOpen)
                {
                    try
                    {
                        serialPort1.Open(); // Abrir puerto.
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
    
            private void buscar_archivo_Click(object sender, EventArgs e)
            {
                // Encuentra el archivo...
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
                }
    
                // Inmediatamente lo lee en byte en el richTextBox_hex.
                Cursor cur = this.Cursor;
                this.Cursor = Cursors.WaitCursor;
    
                //
                int b;
                FileStream fs = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Open, FileAccess.Read);
                StringBuilder sb = new StringBuilder();
    
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0:X02} ", b));
    
                richTextBox_Hex.Text = sb.ToString();
                // richTextBox_Hex.Font = new Font("Courier New", 10);
                // richTextBox_Hex.ScrollBars = ScrollBars.Vertical;
                richTextBox_Hex.SelectionStart = 0;
    
                sb.Clear();
                fs.Position = 0;
                Encoding ibmdos = Encoding.GetEncoding(437);
                while ((b = fs.ReadByte()) != -1) sb.Append(string.Format("{0, 3} ", ibmdos.GetChars(new byte[] { (byte)b })[0]));
                fs.Close();
                richTextBox_ASCII.Text = sb.ToString();
                //
                this.Cursor = cur;
            }
    
            private void button_Grabar_Click(object sender, EventArgs e)
            {
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text); // Carga el archivo en el array.
    
                progressBar_barrra_progreso.Minimum = 0; // Barra de progreso en 0.
                progressBar_barrra_progreso.Maximum = archivo.Length; // Hasta donde llegue el tamaño del archivo.
            }
    
            // Variables.
            bool alto = false;
            int N = 0;
            int P = 0;
            int resultado = 0;
    
            private void TestDoEvents()
            {
                // Carga el archivo en el array.
                byte[] archivo = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
    
                // Hasta donde llegue el tamaño del archivo.
                progressBar_barrra_progreso.Maximum = archivo.Length;
    
                // Guarda la cantidad de Bytes del archivo en la variable.
                N = archivo.Length -1; 
    
                // Transmite byte en byte los datos del archivo al puerto serie.
                for (int posicion = 0; posicion <= archivo.GetUpperBound(0); posicion++)
                {
                    // Enviando archivo al puerto serie.
                    serialPort1.Write(archivo, posicion, 1);
                    
                    // Números de Bytes.
                    P = posicion;
                    
                    // Resultado de la regla de tres. Cálculo del porcentaje de la barra de progreso.
                    resultado = ((100 * posicion) / N);
                    
                    // Muestra barra del progreso.
                    progressBar_barrra_progreso.Value = posicion;
    
                    // Mostrar mensaje.
                    statusStrip_Info.Items[0].Text = "Info: Grabando EEPROM..  " + resultado + "%";
    
                    // Muestra la cantidad de Bytes enviados.
                    label_Bytes_transmitidos.Text = posicion.ToString() + " Bytes.";
    
                    // Muestra la cantidad en porciento archivo enviado.
                    label_Por_ciento.Text = resultado + " %";
    
                    // Evento de cancelación.
                    Application.DoEvents();
                    if (alto == true)
                    {
                        alto = false;
                        break; // TODO: might not be correct. Was : Exit For
                    }
                }
    
                if (button_Cancelar.Text == "Cancelar")
                {
                    MessageBox.Show("Grabación finalizada.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    statusStrip_Info.Items[0].Text = "Info: Envio finalizado, en espera del próximo proceso";
                    button_Cancelar.Text = "Arranque";
                    label_Bytes_transmitidos.Text = "0";
                    label_Por_ciento.Text = "0%";
                    progressBar_barrra_progreso.Value = 0;
                }
    
                button_Cancelar.Text = "Arranque";
            }
    
            private void button_Cancelar_Click(object sender, EventArgs e)
            {
                if (button_Cancelar.Text == "Arranque")
                {
                    DialogResult Res = MessageBox.Show("¿Realmente deseas grabar esta EEPROM?", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                    if (Res == DialogResult.OK)
                    {
                        button_Cancelar.Text = "Cancelar";
                        TestDoEvents();
                    }
                    else
                    {
                        return;
                    }
                }
                else
                {
                    if (alto == true)
                    {
                        alto = false;
                    }
                    else
                    {
                        Cancelar();
                    }
                }
            }
    
            private void Cancelar()
            {
                alto = true;
                button_Cancelar.Text = "Arranque";
                label_Bytes_transmitidos.Text = "0";
                label_Por_ciento.Text = "0%";
                progressBar_barrra_progreso.Value = 0;
                statusStrip_Info.Items[0].Text = "Info: Operación cancelada por el Usuario, en espera del próximo proceso";
            }
    
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                Cancelar();
            }
        }
    }

    Por ahora funciona muy bien el modo escritura.


    http://electronica-pic.blogspot.com



    http://electronica-pic.blogspot.com

    martes, 22 de agosto de 2017 23:01
  • Bueno, no se yo colocaría tambien serialPoirt.Close (); dentro de las instrucciónes Cancelar(); como última, por lo que creo el valor alto= true; hace que finalize pero no esta demás cerrar el puerto, tu te fijas, creo que está hecho, si mi ayuda te sirvió votala como tal ....bla bla bla ja

    Saludos amigo
    • Marcado como respuesta Metaconta martes, 22 de agosto de 2017 23:31
    martes, 22 de agosto de 2017 23:08
  • Exacto, primero Cancelar luego cerrar el puerto.

            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                Cancelar(); // Cancelar cualquier operación activa.
                serialPort1.Close(); // Cerrar puerto serie.
            }
    No me olvido marcar en verde. ;) Tienes 2,265 Puntos ahora. DEspués de las marcadas no se.


    http://electronica-pic.blogspot.com



    • Editado Metaconta martes, 22 de agosto de 2017 23:29
    martes, 22 de agosto de 2017 23:27
  • Fijate en el link que te pasé hay un tema con los tiempos de open() y close() tal vez eso era lo que me pasaba a mí.

     Saludos amigo voy viendo el otro post que me dijiste

    martes, 22 de agosto de 2017 23:36
  • Hola:

    Si te refieres a este enlace, nada que ver.

    Ya funciona. en este tema. El otro tema me estoy volviendo loco.

    Saludos.


    http://electronica-pic.blogspot.com

    martes, 22 de agosto de 2017 23:45