Autor Tema: ¿Cómo puedo recibir un archivo por puerto serie en C#?  (Leído 8956 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
¿Cómo puedo recibir un archivo por puerto serie en C#?
« en: 27 de Febrero de 2010, 02:49:48 »
Hola compañeros.
Abro éste post con el siguiente caso:

Voy a enviar un archivo cualquiera (.txt, .dat, etc) por puerto serial. En el transmisor se hace la conversión del archivo a un array de bytes:

Código: C#
  1. string Dir = @"Ruta y nombre del archivo a enviar";            
  2. .
  3. .
  4. FileStream inStream = File.OpenRead(Dir);
  5. byte[] ArchivoByte = new byte[inStream.Length];
  6. inStream.Read(ArchivoByte, 0, (int)inStream.Length);
  7. inStream.Close();

Luego el receptor recibe cada byte según llega, pero ¿cómo hago para recomponer todos los bytes que llegan en el archivo original?

Estaba pensando en guardar los bytes y que el transmisor envíe el nombre y extensión del archivo, para luego al archivo con los bytes guardados, se le cambie al nombre correspondiente....pero no se exactamente como hacerlo bien.

Alguna sugerencia? Gracias compañeros

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #1 en: 02 de Marzo de 2010, 10:08:31 »
Podrías indicar con algunos comandos especiales la información del archivo a enviar/recibir antes de proceder a la operación, como el nombre y tamaño. De esa forma, el receptor sabe el nombre de archivo a crear y el número de bytes que recibirá.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #2 en: 23 de Noviembre de 2010, 12:07:05 »
Al fin como resolviste el problema? necesito hacer una transferencia de un vídeo, es posible?

desde ya gracias!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #3 en: 23 de Noviembre de 2010, 12:44:52 »
Al fin como resolviste el problema? necesito hacer una transferencia de un vídeo, es posible?

desde ya gracias!

Es posible, puedes implementar lo que dice Geo, y después trabajar con los datos del archivo, que en si son Bytes.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #4 en: 23 de Noviembre de 2010, 15:18:04 »
Al fin como resolviste el problema? necesito hacer una transferencia de un vídeo, es posible?

desde ya gracias!

Es posible, puedes implementar lo que dice Geo, y después trabajar con los datos del archivo, que en si son Bytes.


Saludos!

jajaja Suky tu que lenguaje de programación no sabes?  :D

Bueno yo lo trabajo como bytes, pero cuando recibo como los voy agregando para formar el archivo?

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #5 en: 23 de Noviembre de 2010, 15:28:58 »
En la aplicación C# puedes abrir o crear un archivo como binario, así que solo tienes que leerlo/guardarlo tal cual está y no pierde el formato. Ahora del otro lado no se que hay  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #6 en: 23 de Noviembre de 2010, 21:51:06 »
En la aplicación C# puedes abrir o crear un archivo como binario, así que solo tienes que leerlo/guardarlo tal cual está y no pierde el formato. Ahora del otro lado no se que hay  :mrgreen:

del otro lado tengo una terminal móvil que tiene .net compact framework 3.5 (con WINCE 5.0), por lo cual no maneja el fileString, solo la clase System.IO.File es lo mas cercano.

Lo que quiero es enviarle un vídeo por GPRS, lo único malo es que el modulo GPRS le entrega los datos a la aplicación por un puerto serial interno, lo que me obliga a tratar las conexiones a Internet como puertos seriales, tanto que el mismo modulo se encarga de las conexiones tcp/ip.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #7 en: 23 de Noviembre de 2010, 22:06:45 »
Hay que trabajarlo como archivo binario, no como string, así que seguro se puede hacer tranquilamente.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #8 en: 24 de Noviembre de 2010, 11:10:00 »
Hay que trabajarlo como archivo binario, no como string, así que seguro se puede hacer tranquilamente.


Saludos!

Gracias Suky investigando me encontre con esto habla de System.IO.FileStream solo faltaria enviar los byte[] y recibir la misma trama del otro lado.

Espero les sirva alguien que tenga el mismo problema.

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #9 en: 25 de Noviembre de 2010, 18:56:32 »
Muy buenas, te explico como lo hice yo hace tiempo, primero mando el nombre y el tamaño del archivo, creo recordar que siempre usaba el mismo numero de bytes para esto. Ya despues para enviar usaba esto:

Código: [Seleccionar]
FileStream fuente = new FileStream("directorio fichero", FileMode.Open, FileAcces.Read);
byte[] bufer = new byte[256];
int Numbytes;

while(true)
{
     Numbytes= fuente.Read(bufer, 0 , 256);
     if(Numbytes == 0) break;
     port.Write(fuente, 0, Numbytes);
}

fuente.Close();

y en el receptor (este tengo mas dudas, pero creo que lo hacia asi)

Código: [Seleccionar]

//variables globales
long tamaño;            //ya establecido anteriormente
FileStream Destino;

//Lo declaro cuando recibo el nombre y tamaño.
Destino = new FileStream("nombre destino", FileMode.Create, FileAccess.Write);

static void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        byte[] bufer = new byte[256];
        int nbytes=port.BytesToRead;
        if(nbytes > 256) nbytes=256;   //me aseguro de no leer mas que el tamaño del bufer

        port.Read(bufer, 0, nbytes);

        Destino.Write(bufer, 0, nbytes);

        tamaño -= nbytes;
        if(tamaño==0)  //archivo recibido
        {
               Destino.Close();
        }

}

Espero te sirva. Saludos
« Última modificación: 25 de Noviembre de 2010, 18:58:41 por tannke »

Desconectado fidodido18

  • PIC18
  • ****
  • Mensajes: 312
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #10 en: 26 de Noviembre de 2010, 10:25:30 »
Gracias mi hermano, ya me diste bastante idea, sin embargo yo no trabajo por el evento del puerto serial, sino que me toca decirle a mi modulo GPRS conectado por un puerto serial interno que me entregue los datos!  :shock:

Así es un poco mejor porque tienes control de cuando pedir los datos, sin embargo te toca diseñar tu propio hilo que se encargue de pedirle la información por comandos AT.

Gracias nuevamente! ese programa lo utilizaste para WINCE? o para PC?

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
« Respuesta #11 en: 26 de Noviembre de 2010, 11:16:22 »
Me alegro que te sea util, almenos para darte una idea, bueno, yo lo utilicé de Pc a Pc, un programa sin ninguna utilidad mas que para aprender a utilizar en puerto serie.

Un saludo