TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: sauron en 27 de Febrero de 2010, 02:49:48

Título: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: sauron 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
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: Geo 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á.
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: fidodido18 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!
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: Suky 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!
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: fidodido18 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?
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: Suky 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:
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: fidodido18 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 (http://www.bolymin.com.tw/Embeddeddetail.asp?productid=184) 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.
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: Suky 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!
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: fidodido18 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 (http://msdn.microsoft.com/es-es/library/system.io.filestream(v=VS.80).aspx) 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.
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: tannke 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
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: fidodido18 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?
Título: Re: ¿Cómo puedo recibir un archivo por puerto serie en C#?
Publicado por: tannke 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