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:
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)
//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