Foro de elhacker.net

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
  1. byte[] rawData = {
  2.    0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01,
  3.    0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xFF, 0xDB, 0x00, 0x43
  4. };

¿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
  1. using System;
  2. using System.IO;
  3. using System.IO.Ports;
  4. using System.Text;
  5.  
  6. namespace Recibir_archivo_desde_Arduino_consola
  7. {
  8.    class Program
  9.    {
  10.        public static string Recibidos = "";
  11.        public static byte[] datosArray = Encoding.ASCII.GetBytes(Recibidos);
  12.  
  13.        static void Main(string[] args)
  14.        {
  15.            string COM = "";
  16.  
  17.            // Tamaño ventana consola.
  18.            Console.WindowWidth = 55; // X. Ancho.
  19.            Console.WindowHeight = 15; // Y. Alto.
  20.            Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro"; // Título de la ventana.
  21.  
  22.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  23.            SerialPort Puerto_serie = new SerialPort();
  24.  
  25.            // Configuración.
  26.            Console.Write(@"
  27. Introduzca un número para seleccionar puerto COM.
  28. Por ejemplo el 4, sería COM4.
  29.  
  30. Puerto: ");
  31.            COM = Console.ReadLine(); // Escribir el número del puerto.
  32.            Console.Clear();
  33.  
  34.            Puerto_serie.PortName = "COM" + COM; // Número del puerto serie.
  35.  
  36.  
  37.            Puerto_serie.BaudRate = 115200; // Baudios.
  38.            Puerto_serie.Parity = Parity.None; // Paridad.
  39.            Puerto_serie.DataBits = 8; // Bits de datos.
  40.            Puerto_serie.StopBits = StopBits.Two; // Bits de parada.
  41.            Puerto_serie.Handshake = Handshake.None; // Control de flujo.
  42.  
  43.            // Establecer la lectura / escritura de los tiempos de espera.
  44.            Puerto_serie.ReadTimeout = 500;
  45.            Puerto_serie.WriteTimeout = 500;
  46.  
  47.            try
  48.            {
  49.                Puerto_serie.Open(); // Abrir el puerto serie.
  50.            }
  51.  
  52.            catch (IOException)
  53.            {
  54.                Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
  55.                Console.CursorVisible = false;
  56.                Console.SetCursorPosition(16, 6);
  57.                Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe
  58.                o no lo encuentra.");
  59.            }
  60.  
  61.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  62.  
  63.            Console.Read();
  64.            Puerto_serie.Close(); // Cerrar puerto.
  65.        }
  66.  
  67.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  68.  
  69.        {
  70.            SerialPort sp = (SerialPort)sender;
  71.            int ByteLeidos = sp.Read(datosArray, 0, 28256);
  72.  
  73.            Console.Write(ByteLeidos);
  74.        }
  75.    }
  76. }

Para saber la cantidad de byte recibidos hice esto.
Código
  1.            SerialPort sp = (SerialPort)sender;
  2.            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é.
Código
  1. // Enviar tramas de byte al puerto serie.
  2.  
  3. int estadoBoton = 0; // Guardará el estado del botón HIGH o LOW.
  4. int anteriorBoton = 0;
  5. char caracter;
  6. String comando;
  7. int flagMensaje = 0;
  8.  
  9. // Esta trama de bytes corto en realidad es extremadamente largo, en este caso es como ejemplo.
  10. PROGMEM const unsigned char rawData[] = {
  11.  0xFF, 0xD8, 0xFF, 0xE1, 0x00, 0x18, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00
  12. };
  13.  
  14. void setup()
  15. {
  16.  pinMode(13, OUTPUT); // Donde está el Led 13.
  17.  pinMode(8, INPUT); // Entrada digital donde está el pulsador.
  18.  Serial.begin(115200);
  19. }
  20.  
  21. void enviarImagen() {
  22.  for (unsigned int i = 0; i < sizeof(rawData); i++)
  23.    Serial.write(pgm_read_byte(&rawData[i]));
  24. }
  25.  
  26. void loop()
  27. {
  28.  estadoBoton = digitalRead(8); // Leer entrada digital número 8.
  29.  
  30.  // Si el pulsador está pulsado, se enciende el Led 13 y
  31.  // envía comando HIGH por el puerto serie.
  32.  
  33.  if (estadoBoton != anteriorBoton) // Comprueba si ha habido un cambio en el estado del botón.
  34.  {
  35.    flagMensaje = 0;                // Resetea la bandera a 0.
  36.    anteriorBoton = estadoBoton;    // Guarda el estado actual del botón.
  37.  }
  38.  
  39.  if (estadoBoton == HIGH && flagMensaje == 0) // Comprueba que el botón esté pulsado y que no se haya enviado el mensaje.
  40.  {
  41.    digitalWrite(13, HIGH);
  42.    //Serial.write("ON");
  43.    enviarImagen(); // Enviar imagen o foto hacia el puerto serie al PC.
  44.    delay(50);
  45.  
  46.    if (flagMensaje == 0) // Si se envío el mensaje aumenta la variable a 1 para no enviarlo la próxima vez.
  47.      flagMensaje++;
  48.  }
  49.  
  50.  // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
  51.  else if (flagMensaje == 0) // Si el botón no está presionado y aún no se envía el mensaje.
  52.  {
  53.    digitalWrite(13, LOW);
  54.    //Serial.write("OFF");
  55.    delay(50);
  56.  
  57.    if (flagMensaje == 0) // Si se envió el mensaje aumenta la variable en 1 para no enviarla la próxima vez.
  58.      flagMensaje++;
  59.  }
  60. }

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
  1. File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro.

Código
  1. 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.