Test Foro de elhacker.net SMF 2.1

Informática => Electrónica => Mensaje iniciado por: Meta en 30 Diciembre 2016, 08:31 AM

Título: ¿Cómo se hace un array de C# a Arduino?
Publicado por: Meta en 30 Diciembre 2016, 08:31 AM
Hola:

Tengo un array tipo byte[] en C# que es este:
Código (csharp) [Seleccionar]
byte[] rawData = {
    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01,
    0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43
};


¿Cómo es en Arduino?

Quiero la misma información que el de C#.

¿Cómo se envía por el puerto serie al pulsar un botón esos datos?

Saludos.
Título: Re: ¿Cómo se hace un array de C# a Arduino?
Publicado por: engel lex en 30 Diciembre 2016, 08:34 AM
has intentado googlear o leerte tutoriales? ya estás haciendo preguntas que la documentación oficial puede responder
Título: Re:
Publicado por: Simranjit en 30 Diciembre 2016, 21:54 PM
Si sabes c# es mejor usarlo en vez de usar la ide de arduino usa una que te permita hacerlo con c# que es mejor, buscalo en google merece la pena.

Enviado desde mi E2333 mediante Tapatalk
Título: Re: ¿Cómo se hace un array de C# a Arduino?
Publicado por: Meta en 3 Enero 2017, 04:23 AM
Hola:

Teniendo el código hecho.
Código (csharp) [Seleccionar]
using System;
using System.IO;
using System.IO.Ports;
using System.Text;

namespace Recibir_archivo_desde_Arduino_consola
{
    class Program
    {
        public static string Recibidos = "";
        public static byte[] datosArray = Encoding.ASCII.GetBytes(Recibidos);

        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.
            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 = 500;
            Puerto_serie.WriteTimeout = 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.");
            }

            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
           
            Console.Read();
            Puerto_serie.Close(); // Cerrar puerto.
        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)

        {
            SerialPort sp = (SerialPort)sender;
            int ByteLeidos = sp.Read(datosArray, 0, 28256);

            Console.Write(ByteLeidos);
        }
    }
}


Para saber la cantidad de byte recibidos hice esto.
Código (csharp) [Seleccionar]
            SerialPort sp = (SerialPort)sender;
            int ByteLeidos = sp.Read(datosArray, 0, 28256);


Me da error.
(https://social.msdn.microsoft.com/Forums/getfile/983496)

Exactamente puse los mismos bytes que dice aquí.
(https://social.msdn.microsoft.com/Forums/getfile/983500)

El programa de Arduino IDE ya lo saqué.

// Enviar tramas de byte al puerto serie.

int estadoBoton = 0; // Guardará el estado del botón HIGH o LOW.
int anteriorBoton = 0;
char caracter;
String comando;
int flagMensaje = 0;

// Esta trama de bytes corto en realidad es extremadamente largo, en este caso es como ejemplo.
PROGMEM const unsigned char rawData[] = {
  0xFF, 0xD8, 0xFF, 0xE1, 0x00, 0x18, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00
};

void setup()
{
  pinMode(13, OUTPUT); // Donde está el Led 13.
  pinMode(8, INPUT); // Entrada digital donde está el pulsador.
  Serial.begin(115200);
}

void enviarImagen() {
  for (unsigned int i = 0; i < sizeof(rawData); i++)
    Serial.write(pgm_read_byte(&rawData[i]));
}

void loop()
{
  estadoBoton = digitalRead(8); // Leer entrada digital número 8.

  // Si el pulsador está pulsado, se enciende el Led 13 y
  // envía comando HIGH por el puerto serie.

  if (estadoBoton != anteriorBoton) // Comprueba si ha habido un cambio en el estado del botón.
  {
    flagMensaje = 0;                // Resetea la bandera a 0.
    anteriorBoton = estadoBoton;    // Guarda el estado actual del botón.
  }

  if (estadoBoton == HIGH && flagMensaje == 0) // Comprueba que el botón esté pulsado y que no se haya enviado el mensaje.
  {
    digitalWrite(13, HIGH);
    //Serial.write("ON");
    enviarImagen(); // Enviar imagen o foto hacia el puerto serie al PC.
    delay(50);

    if (flagMensaje == 0) // Si se envío el mensaje aumenta la variable a 1 para no enviarlo la próxima vez.
      flagMensaje++;
  }

  // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
  else if (flagMensaje == 0) // Si el botón no está presionado y aún no se envía el mensaje.
  {
    digitalWrite(13, LOW);
    //Serial.write("OFF");
    delay(50);

    if (flagMensaje == 0) // Si se envió el mensaje aumenta la variable en 1 para no enviarla la próxima vez.
      flagMensaje++;
  }
}


Dentro del los bytes hay una foto, en Arduino IDE, en el cual C# debe captar los datos y no me sale. Cuando lo capte, tiene que usar estas instrucciones que aún no he puesto, que es crear el archivo en el disco duro,luego ejecutar la foto.

Código (csharp) [Seleccionar]
File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro.

Código (csharp) [Seleccionar]
Process.Start("fotón.jpg"); // Ejecutar visualizador de imágenes.

Antes, C# tiene que ser capaz de capturar los datos desde el puerto serie y guardarlo en memoria en C#.

Feliz año nuevo 2017.