none
Modificar este código RRS feed

  • Pregunta

  • Hola:

    Tengo este código de abajo que funciona bien. Lo que hace es, al recibir algún dato por el puerto serie, me lo almacena en un array y guarda el archivo en el disco duro. Hecho en C#.

    using System;
    using System.Diagnostics;
    using System.IO;
    using System.IO.Ports;
    
    namespace Recibir_archivo_desde_Arduino_consola_02
    {
        class Program
        {
            static void Main(string[] args)
            {
                string COM = "";
    
                // Tamaño ventana consola.
                Console.WindowWidth = 55; // X. Ancho.
                Console.WindowHeight = 15; // Y. Alto.
                Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro"; // Título de la ventana.
    
                // Crear un nuevo objeto SerialPort con la configuración predeterminada.
                SerialPort Puerto_serie = new SerialPort();
    
                // Configuración.
                Console.Write(@"
    Introduzca un número para seleccionar puerto COM.
    Por ejemplo el 4, sería COM4.
    
    Puerto: ");
                COM = Console.ReadLine(); // Escribir el número del puerto.
                Console.Clear();
    
                Puerto_serie.PortName = "COM" + COM; // Número del puerto serie.
    
    
                Puerto_serie.BaudRate = 115200; // Baudios. 115200.
                Puerto_serie.Parity = Parity.None; // Paridad.
                Puerto_serie.DataBits = 8; // Bits de datos.
                Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
                Puerto_serie.Handshake = Handshake.None; // Control de flujo.
    
                // Establecer la lectura / escritura de los tiempos de espera.
                Puerto_serie.ReadTimeout = -1; // 500.
                Puerto_serie.WriteTimeout = -1; // 500.
    
                try
                {
                    Puerto_serie.Open(); // Abrir el puerto serie.
                }
    
                catch (IOException)
                {
                    Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
                    Console.CursorVisible = false;
                    Console.SetCursorPosition(16, 6);
                    Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe
                    o no lo encuentra.");
                    Console.ReadKey(); // Pulse cualquier tecla para salir.
                }
    
                catch (UnauthorizedAccessException e)
                {
                    Console.WriteLine(e);
                }
                Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    
                Console.WriteLine("Esperando datos desde Arduino...");
                Console.Read();
                Puerto_serie.Close(); // Cerrar puerto.
            }
    
            private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    
            {
                try
                {
                    SerialPort sp = (SerialPort)sender;
                    int contador = 0;
                    byte[] datosArray = new byte[17729]; // Aquí tengo que cambiar el valor cuando recibo datos desde el puerto serie.
    
                    while (contador < datosArray.Length)
                    {
    
                        contador += sp.Read(datosArray, contador, datosArray.Length - contador);
    
                        Console.SetCursorPosition(10, 2);
                        Console.Write("Datos recibidos:  {0}", contador);
                        Console.WriteLine("                   ");
    
                        if (contador == 17729)
                        {
                            Console.WriteLine();
                            Console.WriteLine("Creando archivo al disco duro...");
                            File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro.
                            Console.WriteLine();
                            Console.WriteLine("Archivo creado. Ejecutando imagen.");
                            Process.Start("fotón.jpg"); // Ejecutar visualizador de imágenes.
                            Console.WriteLine();
                            Console.WriteLine("Imagen ejecutada.");
                            Console.WriteLine();
                            Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
                            Console.WriteLine("FIN DE PROGRAMA.");
                            Console.ForegroundColor = ConsoleColor.Gray; // Letras grises otra vez.
                        }
                    }
                }
    
    
                catch (TimeoutException)
                {
                    //maybe increase ReadTimeout or something, use exponential backoff, your call
                }
    
                catch (IOException)
                {
                    // Console.WriteLine("La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación.");
                }
            }
        }
    }

    Quiero tener ideas para modificar este programa.

    Los datos del puerto serie puede llegar desde Arduino o desde otro PC. Como llega desde Arduino en este caso, tiene dos botones, si pulsa el primer botón, C# recibe ciertos comandos que son estos:

    Si en Arduino presiono el primer botón, C# le llega este número de 5 Bytes en este caso, 17729. Ese valor tiene que incluirse aquí, en esta parte del código indicado abajo.

    byte[] datosArray = new byte[17729];

    Como puedes ver, he puesto manualmente el valor de este array 17729.

    ¿Cómo hago que al detectar cualquier valor, en este caso 17729 sea para el array datosArray?

    Digo 17729 como ejemplo, si le llega 478, pues que sea 478.

    Lo que no entiendo que luego de llegar 17729, que son solo 5 dígitos, llegará de inforamación 17729 Bytes detrás.

    Si no haz entendido algo, preguntar para explicarlo de otra manera.

    Saludos.


    http://electronica-pic.blogspot.com

    miércoles, 25 de enero de 2017 1:56

Todas las respuestas

  • A lo mejor hay que cambiar la forma de hacer las cosas.

    1. C# espera que le lleguen datos.
    2. Arduino envía solo este valor 17729.
    3. C# convierte de string a int y el arrayDatos ya tiene el tamaño deseado.
    4. C# le envía por el puerto serie estos caráscteres, OK.
    5. Arduino entiende el OK y envía el resto de tramas de bytes.
    6. C# almacena los datos en el arrayDatos, crea el archivo al disco duro y lo abre, en este caso es una foto.

    Me parece que aí está mejor que enviar todo de golpe como pretendía en un principio. La pregunta es.

    ¿Cómo se hace?

    Mira que me lavé el cerebro, ajjajaj jaj ajaja para lograr donde he llegado.

    Saludos.

    http://electronica-pic.blogspot.com

    miércoles, 25 de enero de 2017 12:45