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