none
Recibir archivos

    Question

  • Hola:

     

    Hice con la ayuda de este foro MSDN, puede que sea hasta usted mismo logré hacer:

    1. Con un botón Buscar, encontrar un archivo.bin.
    2. Cargarlo en un textBox con propiedad MultiLine y que se pueda leer.
    3. Enviar por puerto serie dicho archivo.bin con el botón Grabar.

    Me faltan algunas cosas, por ejemplo:

    1. Con un label1 que me muestre la cantidad en KBytes en el momento cuando envío un archivo.
    2. Otro label2 para saber en porsentaje de la cantidad que le falta o tiene enviado el archivo.
    3. Un progressBar para saber la cantidad en porcentaje con forma de barra cuando está enviando los datos.

    Espero que no sea muy complejo en hacer estas cosas.

    Les doy abajo el código completo de lo que hay ahora. Antes que nada, si crees que es muy mejorable los códigos o el envío de datos me lo hace saber, acepto cualquier sugerencia. Si hay que modificar algo se modifica, luego seguimos con los 3 puntos que deseo tener.

     

     

     

     

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.IO; // No olvidar.
    using System.IO.Ports;
    
    namespace EEPROM_Prueba
    {
     public partial class Form1 : Form
     {
      public Form1()
      {
       InitializeComponent();
       // Abrir puerto mientra se ejecute la aplicación
       if (!serialPort1.IsOpen)
       {
        try
        {
         serialPort1.Open();
        }
        catch (System.Exception ex)
        {
         MessageBox.Show(ex.ToString());
        }
       }
      }
    
      private void button_buscar_archivo_Click(object sender, EventArgs e)
      {
       // Encuantro un archivo...
       if (openFileDialog1.ShowDialog() == DialogResult.OK)
       {
        textBox_ubicacion_archivo.Text = openFileDialog1.FileName.ToString();
       }
    
       // ...inmediatamente lo lee en byte en el textBox_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));
       fs.Close();
    
       textBox_hex.Text = sb.ToString();
       // textBox_hex.Font = new Font("Courier New", 10);
       // textBox_hex.ScrollBars = ScrollBars.Vertical;
       textBox_hex.SelectionStart = 0;
    
       //
       this.Cursor = cur;
    
      }
    
      private void button_Grabar_Click(object sender, EventArgs e)
      {
       byte[] file = null;
       file = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
       for (int i = 0; i <= file.GetUpperBound(0); i++)
       {
        serialPort1.Write(file, i, 1);
       }
    
    
      }
     }
    }
    
    

     

    Saludo.


    http://electronica-pic.blogspot.com
    Monday, April 25, 2011 10:26 AM

Answers

  • hola

    1-

    para ver la capacidad de un archivo nuevamente puedes recurrir a la clase FileInfo

    en este tienes una propiedad Length que devuelve el tamaño del archivo en byte, si a ese valor lo divides 1024 lo obtendras en kb

    2 y 3-

    bueno estos dos puntos pueden ser algo mas complejos, porque dependen de como envias el archivo por el puerto serie, otros tipos de transmissiones como ser el un upload a un sitio tienen funcionalidad de subida asincrona, por lo tanto crean un hilo separado y van informando del prograso en un evento

    Update the Progress bar using winforms c#

    quizas podrias usar un control

    BackgroundWorker 

    BackgroundWorker (Componente)

     

    y con este implementar la funcionalidad en un thread separado para poder enviar el archivo en partes reflejando el progreso hasta completarlo

    a donde apunto es que si invocas a un solo metodo pasandole el archivo o array de byte completo este no informara del estado y por lo tanto no tendras forma de reflejar avanza en el progress

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, April 25, 2011 10:44 AM

All replies

  • hola

    1-

    para ver la capacidad de un archivo nuevamente puedes recurrir a la clase FileInfo

    en este tienes una propiedad Length que devuelve el tamaño del archivo en byte, si a ese valor lo divides 1024 lo obtendras en kb

    2 y 3-

    bueno estos dos puntos pueden ser algo mas complejos, porque dependen de como envias el archivo por el puerto serie, otros tipos de transmissiones como ser el un upload a un sitio tienen funcionalidad de subida asincrona, por lo tanto crean un hilo separado y van informando del prograso en un evento

    Update the Progress bar using winforms c#

    quizas podrias usar un control

    BackgroundWorker 

    BackgroundWorker (Componente)

     

    y con este implementar la funcionalidad en un thread separado para poder enviar el archivo en partes reflejando el progreso hasta completarlo

    a donde apunto es que si invocas a un solo metodo pasandole el archivo o array de byte completo este no informara del estado y por lo tanto no tendras forma de reflejar avanza en el progress

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, April 25, 2011 10:44 AM
  • Me salió lo de la barrad e progreso.

     

    private void button_Grabar_Click(object sender, EventArgs e)
        {
          byte[] file = File.ReadAllBytes(textBox_ubicacion_archivo.Text);
    
          progressBar1.Visible = true;
          progressBar1.Minimum = 1;
          progressBar1.Maximum = file.Length;
          progressBar1.Value = 1;
          progressBar1.Step = 1;
    
          for (int i = 0; i <= file.GetUpperBound(0); i++)
          {
            serialPort1.Write(file, i, 1);
            progressBar1.PerformStep();
          }
    
          progressBar1.Value = 1;
        }
    
    Voy a investigar lo demás.


    http://electronica-pic.blogspot.com
    Monday, April 25, 2011 11:11 AM
  • Me di cuenta de una cosa.

    Estaba enviadno unos 70 MB a 9600 baudios, lo probñe con 115200 y es muy lento. Para hacer cositas con menos de un 1 KB está muy bien.

    Me pasó cuando hacía pruebas con archivos grandes, no puedo cancelar el envío de datos.

    Quiero poner un botón que diga cAncelar y que al pularlo cancele la operación cuando está en proceso. Si lo pulsa, al menos que salga un mensaje tipo:

    ¿Estás seguro que deseas cancelar la operación? o algo similar.

    ¿Cuando se envía archivos, se puede interrumpir o cancelar la operación sin que le pase nada los archivos o otra cosa rara o fallos?

    Si existe. ¿Cómo se hace?


    http://electronica-pic.blogspot.com
    Monday, April 25, 2011 11:48 AM