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 original
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. 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.