none
Leer y guardar archivo RRS feed

  • Pregunta

  • Hola:

    Para enviar un archivo por puerto serie lo hago así:

    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 = 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;
        }
      }
    }
    
    

    Quiero saber como se hace lo de recibir un archivo.bin o .txt por puerto serie. En algún lado se guardará en memoria. Luego que pase a un etxtBox en Multiline o otro componente más adecuado. Luego con un botón, guardar el archivo recibido en cualquier parte del disco duro. Este último hay que usar el este componente.

    Lo he intentado leer así, pero no es así.

    private void button_Leer_Click(object sender, EventArgs e)
        {
          byte[] file = serialPort1.ReadLine();
    
          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.Read(file, i, 1);
            progressBar1.PerformStep();
          }
    
          progressBar1.Value = 1;
        }
    

    Saludo.


    http://electronica-pic.blogspot.com
    miércoles, 27 de abril de 2011 2:25

Respuestas

Todas las respuestas

  • Buenas Metaconta.

    Puedes convertir un Array de Bytes a un fichero de la siguiente manera:

     

    System.IO.FileStream oFileStream;
    oFileStream = New System.IO.FileStream(RutaCompleta, System.IO.FileMode.Create);
    oFileStream.Write(ArrayBytes, 0, ArrayBytes.Length);
    oFileStream.Close();
    

     

    Un saludo.


    http://www.lopezatienza.es
    miércoles, 27 de abril de 2011 7:34
  • 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 = 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;
        }
    
        private void button_Leer_Click(object sender, EventArgs e)
        {
    <strong>      FileStream oFileStream = new FileStream(textBox_ubicacion_archivo.Text, FileMode.Create);
          oFileStream.Write(file, 0, file.Length);
          oFileStream.Close();
    </strong>    }
      }
    }
    
    
    Me dice esto:
    Error    1    El nombre 'file' no existe en el contexto actual    C:\Users\User\Documents\Visual Studio 2010\Projects\EEPROM_Prueba\EEPROM_Prueba\Form1.cs    86    31    EEPROM_Prueba

    .
    http://electronica-pic.blogspot.com
    miércoles, 27 de abril de 2011 9:14
  • hola

    es que en esta linea

    oFileStream.Write(file, 0, file.Length);

    has usado la variable "file"

    pero no la declaras en ningun lado, de donde sale ?

     

    si revisas el ejemplo de lopezatienza, veras que el define un array de byte alli y si revisas al doc de ese metodo tambien lo menciona

    pero por lo que veo parece que el quiers indicar un archivo fisico

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 27 de abril de 2011 12:10
  • Hola:

     

    Sí, quiero recibir un archivo físico. El archivo puede ser un .hex. un .bin e  incluso un .txt, también .jpg.

     

    private void button_Leer_Click(object sender, EventArgs e)
        {
          StreamWriter sw = new StreamWriter(textBox_ubicacion_archivo.Text, true, ASCIIEncoding);
          sw.WriteLine(serialPort1.ReadLine());
          sw.Close();
        }
    

    El archivo lo quiero recibir desde otro PC con le puerto serie. Si envío cualquier tipo de archivo, debe de recibirlo tal cual. Cuando me llegue al PC, que tenga la posibilidad de donde guardarlo en el disco duro físicamente.

    Ya no está tan fácil


    http://electronica-pic.blogspot.com
    miércoles, 27 de abril de 2011 13:51
  • Buenas Metaconta.

    Yo utilizo esta función para convertir de Fichero a Byte:

     

    public byte[] fiheroAByte(string pFic)
    {
    	System.IO.FileInfo oFile = null;
    	System.IO.FileStream oFileStream = null;
    	try {
    		oFile = new System.IO.FileInfo(pFic);
    		oFileStream = oFile.OpenRead();
    
    	} catch (Exception ex) {
    	}
    
    	long lBytes = oFileStream.Length;
    	byte[] fileData = new byte[lBytes];
    	try {
    		if ((lBytes > 0)) {
    			oFileStream.Read(fileData, 0, lBytes);
    			oFileStream.Close();
    		}
    
    	} catch (Exception ex) {
    	}
    	return fileData;
    }
    

    Posteriormente donde recibe la trama utilizo lo que te comenté anteriormente:

     

    System.IO.FileStream oFileStream;
    oFileStream = New System.IO.FileStream(RutaCompleta, System.IO.FileMode.Create);
    oFileStream.Write(ArrayBytes, 0, ArrayBytes.Length);
    oFileStream.Close();
    

     

    Lo he convertido con http://www.developerfusion.com/tools/convert/vb-to-csharp/ por lo que es posible que algo no esté bien, aunque a simple vista parece que es correcto.

    Un saludo.


    http://www.lopezatienza.es
    miércoles, 27 de abril de 2011 14:03
  • Hola:

     

    ¿Si el archivo que quiero recibir puede ser texto o un binary?

    ¿qué se peude hacer?

    ;)


    http://electronica-pic.blogspot.com
    miércoles, 27 de abril de 2011 20:18
  • ¿Sabes comó se hace lo que dices?
    http://electronica-pic.blogspot.com
    jueves, 28 de abril de 2011 18:57
  • lo que siempre hago para enviar archivos es establecer mi protocolo.

    1. envio un mensaje que indica que se va a enviar un archivo
    2. luego envio el nombre del archivo
    3. luego el tamaño en bytes del archivo
    4. luego envio el archivo usualmente en bloques de x bytes, digamos 1024
    5. el ultimo paquete dependiendo del archivo no sera de 1024 sino del 'sobrante'

    y en el receptor hago lo mismo

    1. escucho que llega el mensje indicando que se enviara archivo
    2. recibo el nombre del archivo
    3. recibo el tamaño del archivo
    4. como se que recibo bloques de 1024 calculo cuantos bloques recibire
    5. recibo los bloques y se que el ultimo bloque es del tamaño del 'sobrante

     

    y eso es todo.


    Juan Carlos Ruiz Pacheco - Microsoft MVP Visual C#
    Visita mi blog:

    C#, XNA, Win32 - http://juank.black-byte.com

    Twitter: @JuanKRuiz
    Facebook: Arquitecto de Software

    viernes, 29 de abril de 2011 16:47
    Moderador