¿Cómo se hace un array de C# a Arduino?

Iniciado por Meta, 30 Diciembre 2016, 08:31 AM

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

Meta

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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

engel lex

has intentado googlear o leerte tutoriales? ya estás haciendo preguntas que la documentación oficial puede responder
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Simranjit

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

Meta

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.


Exactamente puse los mismos bytes que dice aquí.


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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/