Hacer cambios de este código.

Iniciado por Meta, 25 Enero 2017, 03:05 AM

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

Meta

#10
Hola:

Este código C#.

Código (csharp) [Seleccionar]
int cantidadBytes = int.Parse("17729");
byte[] datosArray = new byte[cantidadBytes];



Por supuesto que es como este de abajo que haz puesto.

Código (csharp) [Seleccionar]
byte[] datosArray = new byte[int.Parse("17729")];


Desde el puerto serie me llega 17729 por poner un ejemplo. Y tiene que estar en la variable arriba llamada cantidadBytes.

Cuando me llegue los datos desde el puerto serie precisamente es 17729 como ejemplo.

¿Cómo lo hago?

Solo hay que cambiar el tamaño del array, en este caso el array se llama datosArray.

Quiero solo meter esos valors de 5 Bytes, si es menos como 29, se añadirán 00029. Porque no quiero que se me ponga como tañamo lainformación que pesa 17729, sino indique el tamaño del array que es 17729.

Cuando ya detecte que los 5 primeros Bytes sea el valor que sea y modifique el tamaño del array.
C# tiene que enviar a la placa de Arduino por puerto serie, un OK.
Desde que Arduino detecte el OK, ya puede recibir C# el peso de 17729 que en este caso es una foto.jpg como prueba, puede ser cualquier archivo.

Como me cuesta expresarme.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

ivancea96

Pues utiliza SerialPort Read para leer ese número.
Si siempre van a ser 5 bytes, pues creas un array de 5 bytes y lees en él.
Luego, conviertes el array de Byte a String con, por ejemplo:
Código (csharp) [Seleccionar]
Encoding.UTF8.GetString(byteArray)
Y ya está, el resto es convertirlo a int con int.TryParse o int.Parse.

Meta

Ya me funciona, por finnnnnnnnnn.

Gracias a todos.

Código (csharp) [Seleccionar]
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Ports;
using System.Text;
using System.Threading;

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;
                string indata = sp.ReadExisting(); // A la espera que lea el tamaño del array "datosArray".

                int cantidadBytes = int.Parse(indata);
                byte[] datosArray = new byte[cantidadBytes];

                Thread.Sleep(1000); // Retarde de un segundo para que no se colapse.
                byte[] mBuffer = Encoding.ASCII.GetBytes("OK"); // Codificación ASCII.
                sp.Write(mBuffer, 0, mBuffer.Length); // Envía OK al 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 == cantidadBytes) // 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 (FormatException)
            {
                // La cadena de entrada no tiene el formato correcto.
            }
        }
    }
}


Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/