Hola:
A pesar de tener más experiencia con C#, con la idea de pasarlo a C++, he hecho esto.
Código C#:using System;
using System.Text;
using System.IO.Ports;
namespace Envio_y_recepcion_puerto_serie_cs
{
class Program
{
static void Main(string[] args)
{
// Título de la ventana.
Console.Title = "Recibir datos desde Arduino con C#";
// Tamaño ventana consola.
Console.WindowWidth = 55; // X. Ancho.
Console.WindowHeight = 18; // Y. Alto.
// Cree un nuevo objeto SerialPort con la configuración predeterminada.
SerialPort Puerto_serie
= new SerialPort
("COM4");
Puerto_serie.BaudRate = 115200;
Puerto_serie.Parity = Parity.None;
Puerto_serie.StopBits = StopBits.One;
Puerto_serie.DataBits = 8;
Puerto_serie.Handshake = Handshake.None;
Puerto_serie.RtsEnable = true;
// Establecer los tiempos de espera de lectura / escritura.
Puerto_serie.ReadTimeout = 500; // Milisegundos.
Puerto_serie.WriteTimeout = 500;
// Detecta cualquier dato recibido.
Puerto_serie
.DataReceived += new SerialDataReceivedEventHandler
(DataReceivedHandler
);
Puerto_serie.Open(); // Abrir puerto.
ConsoleKey tecla;
Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");
do
{
tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.
switch (tecla)
{
case ConsoleKey.D1: // Tecla 1 del teclado estandar.
case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
Console.WriteLine("Enviado: {0}", miBuffer1); // Muestra en pantala el mensaje enviado, en este caso, Luz_ON.
break;
case ConsoleKey.D2:
case ConsoleKey.NumPad2:
byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
//Console.WriteLine("Enviado: {0}", miBuffer2);
break;
default:
Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
break;
}
}
// Pulsa Escape para salir del menú.
while (tecla != ConsoleKey.Escape);
Console.WriteLine("Presione cualquier tecla para continuar...");
Console.WriteLine();
Console.ReadKey(); // Espera pulsar una tecla cualquiera.
Puerto_serie.Close(); // Cierra el puerto serie.
}
// Detecta cualquier dato entrante.
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
}
}
}
Es este último código que me funciona mejor, también he intentado que me muestre el valor enviado y me diga en pantalla:
Enviado: Luz_ONHe usado esto para que muestre lo que envía:
Console.WriteLine("Enviado: {0}", miBuffer1);
Su resultado fue este:
Enviado: system.Byte[]¿Pero qué es esto?
Concretamente aquí:
case ConsoleKey.D1:
case ConsoleKey.NumPad1:
byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON");
Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length);
Console.WriteLine("Enviado: {0}", miBuffer1);
break;
Lo bueno que también ya recibo el ON y OFF si pulso el pulsador dede Arduino directamente. Funciona todo menos lo indicado justo arriba.
Debe aparecer de esta manera:
Luz_ONAparece en hexadecimales.
Console.WriteLine("Enviado: {0}", BitConverter.ToString(miBuffer1));
Cuando esté listo todo C#, ya se podrá hacer el C++ de una vez por todas, jaaaj ajajajja. Eso espero y se las debo a todos.
PD:
No me había dado cuenta que tienes un blog, no sabía que eres un profesional de C++.