Hola:
Hice el programa en C#, quiero adaptarlo a C++. Lo que hace C# es desde que pulse la tecla 1 o un 2, envía comandos al puerto serie, Arduino le devuelve respuestas. También Arduino tiene un botón, si lo pulso, la consola de C# lee su contenido.
Código C#:
Código C++:
Ver originalusing 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.
break;
case ConsoleKey.D2:
case ConsoleKey.NumPad2:
byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
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 terminar...");
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.
}
}
}
El código que he hecho hasta ahora en C++ es este pero no funciona como debería.
Código C++:
Código C++:
Ver original#include <iostream>
#include <fstream>
#include <Windows.h>
#include "SerialClass.h"
using namespace std;
void main()
{
// Título de la ventana
SetConsoleTitle("Control Led Arduino.");
// Puerto serie.
Serial* Puerto = new Serial("COM4");
// Comandos para Arduino.
char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
char Luz_OFF[] = "Luz_OFF";
char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.
while (Puerto->IsConnected())
{
cout << endl; // Dejamos un retorno.
cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.
cin >> opc; // Aquí introduces un número, el 1 o el 2.
switch (opc) // Espera recibir un 1 o un 2.
{
case 1:
// Encener luz.
cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
break;
case 2:
// Apagar luz.
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
break;
default: // Si haz pulsado otro número distinto del 1 y 2, muestra
cout << "Puse del 1 al 2."; // este mensaje.
}
while (true) {
int n = Puerto->ReadData(lectura, 49);
if (n > 0) {
lectura[n + 1] = '\0';
break;
}
Sleep(1);
}
cout << "Recibido: " << lectura << endl;
cout << "-------------------" << endl;
}
}
La idea es que el código de C# tenga el mismo funcionamiento en C++.
¿alguna ayuda?
Saludos.