Ver Mensaje Individual
  #18 (permalink)  
Antiguo 04/01/2017, 23:03
REHome
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 17 años
Puntos: 8
Respuesta: Contar las tramas de byte recibidas

Gracias por los consejos.

Siempre aprendo cosas nuevas. Creo que hablas sistemas decodificaciçon, ASCII, UFT-8 por nombrar algunos.

Haciendo pruebas con el código de arriba puse en la varible de este código 30000 porque se que me llegan 28256.
Código:
byte[] datosArray = new byte[30000];
Si pongo por poner un ejemplo:
Código:
byte[] datosArray = new byte[99999999999];
Me dice: La operación aritmética ha provocado un desbordamiento. Por lo que veo, no puedo poner la cantidad de byte en el array que me de la gana, está limitado y no puedo hacer nada.

De una manera o de otra, la foto creada tiene 30000 tal cual tiene el array. Al examinar la foto, tiene el resto de byte 0 que es normal. A pesar de ello tiene más peso y no me interesa. En otra prueba llegué tener la foto minado de 0 un todal de unas 9 MB para el fisco de foto que sen realidad, 28256 Bytes. Se supone que no debo saber cuantos bytes me van a venir, si me viene 28256 pues que cree el archivo con 28256 y no toda el array que le aclaré el principio solo para que me quepa.

Debe haber alguna forma que me reste 30000 que tengo en el array y lo pase a 28256 que son los bytes recibidos. Si recibo 10 bytes pues que cree una foto de 10 bytes, es un ejemplo tonto para que se entienda.

Ejemplo no acabado por ahora es este:
Código:
using System;
using System.IO;
using System.IO.Ports; // No olvidar.

namespace Puerto_Serie_Rread_consola
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort mySerialPort = new SerialPort("COM4");

            mySerialPort.BaudRate = 115200;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.Two;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;

            // Set the read/write timeouts
            mySerialPort.ReadTimeout = 500;
            mySerialPort.WriteTimeout = 500;

            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);



            mySerialPort.Open();

            Console.WriteLine("Presione cualquier tecla para continuar...");
            Console.WriteLine();
            mySerialPort.DiscardInBuffer(); // Limpiar buffer de entrada.
            Console.ReadKey();
            mySerialPort.Close();
        }

        private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                SerialPort sp = (SerialPort)sender;
                int contador = 0;
                byte[] datosArray = new byte[300000];

                while (contador < datosArray.Length)
                {
                    contador += sp.Read(datosArray, contador, datosArray.Length - contador);
                    Console.SetCursorPosition(10, 2);
                    Console.Write("Dato recibido:  {0}", contador);
                    Console.WriteLine("                   ");

                    if (contador == 28256)
                    {
                        File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro.
                                                                     //Process.Start("fotón.jpg"); // Ejecutar visualizador de imágenes.
                    }
                }
            }

            catch (TimeoutException)
            {
                //maybe increase ReadTimeout or something, use exponential backoff, your call.
                //Console.WriteLine("Fuera de tiempo.");
                //Console.WriteLine(datosArray.Length);
            }

            catch (OverflowException)
            {
                Console.WriteLine("La operación aritmética ha provocado un desbordamiento.");
            }

            catch (InvalidOperationException)
            {
                Console.WriteLine("El puerto está cerrado.");
            }

            catch (IOException)
            {
                Console.WriteLine("La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación.");
            }
        }
    }
}
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar