Hola:
Teniendo el código hecho.
Para saber la cantidad de byte recibidos hice esto.
Me da error.
Exactamente puse los mismos bytes que dice aquí.
El programa de Arduino IDE ya lo saqué.
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.
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.
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é.
Código (c) [Seleccionar]
// 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.