Autor Tema: recibir una imagen del puerto serial en c#  (Leído 3920 veces)

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

Desconectado arthas1888

  • PIC10
  • *
  • Mensajes: 4
recibir una imagen del puerto serial en c#
« en: 09 de Julio de 2012, 13:57:53 »
buenos dias...
pasa lo siguiente necesito recibir una foto o imagen lo hago con la siguiente instruccion:

int bytes = serialPort1.BytesToRead;
               
                byte[] buffer = new byte[bytes];
               
                serialPort1.Read(buffer, 0, bytes);
                foreach (byte elem in buffer)
                {
                    recibido.Add(elem);
                }
            Bitmap imagen = null;
            Byte[] bytes = (Byte[])(buffer);
            MemoryStream ms = new MemoryStream(bytes);
            imagen = new Bitmap(ms);
            pictureBox1.Image = imagen;
            return imagen;


el problema es q cuando recibo la foto solo recibo una parte de ella, y se pierde el resto de la imagen, creo que eso se debe a que los bytes que se leen de puerto serie se guardan en una variable tipo int de modo q me limita los bytes que se recepcionan, lo que quiero es acumular los bytes que se recepcionan con el fin de transformar esos bytes  en bitmap y lograr conseguir la foto en su totalidad; como hago eso??
muchas gracias estare atento a cualquier respuesta por parte de uds!!

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: recibir una imagen del puerto serial en c#
« Respuesta #1 en: 29 de Julio de 2012, 12:30:48 »
El problema es que creas tu matriz (buffer) con el tamaño de los datos recibidos hasta el momento de (int bytes = serialPort1.BytesToRead;), con esta ultima instrucción obtienes el numero de bytes almacenados hasta el momento en el buffer de entrada del puerto y lo que te está pasando es que después de esa instrucción ahun siguen llegando datos de la imagen que tu ya no recoges.

Soluciones varias:

Puedes, antes de enviar la imagen, enviar el tamaño de esta, creas una matriz del tamaño recibido (no uses int, usa algo mas grande como long) y después en un ciclo for ir almacenando los datos recibidos al bufer hasta llegar al tamaño recibido.

Si no quieres/puedes enviar el tamaño:
Viendo que haces uso de memorysteam puedes hacer uso desde el principio con el, algo asi:
Código: [Seleccionar]
MemoryStream ms = new MemoryStream();
while(serialPort1.BytesToRead >0)
{
        ms.WriteByte(serialPort1.ReadByte());
}

Bitmap imagen = new Bitmap(ms);
pictureBox1.Image = imagen;
return imagen;

De esta última manera es raro pero podría llegar a pasar que el buffer llegara a 0 y se saliera del ciclo while sin haber llegado a terminarse de leer el archivo pero eso tiene facil solución, ya te lo dejo a ti si ves que te pasa.

Por otro lado hay mas y seguro que mejores soluciones, estas son las 2 primeras que se me han ocurrido asi pensandolo rapido.

Un saludo


« Última modificación: 29 de Julio de 2012, 12:33:57 por tannke »