Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/03/2017, 08:37
REHome
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 729
Antigüedad: 17 años, 5 meses
Puntos: 8
Pasar código a C++

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 original
  1. using System;
  2. using System.Text;
  3. using System.IO.Ports;
  4.  
  5. namespace Envio_y_recepcion_puerto_serie_cs
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             // Título de la ventana.
  12.             Console.Title = "Recibir datos desde Arduino con C#";
  13.  
  14.             // Tamaño ventana consola.
  15.             Console.WindowWidth = 55; // X. Ancho.
  16.             Console.WindowHeight = 18; // Y. Alto.
  17.  
  18.             // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  19.             SerialPort Puerto_serie = new SerialPort("COM4");
  20.  
  21.             Puerto_serie.BaudRate = 115200;
  22.             Puerto_serie.Parity = Parity.None;
  23.             Puerto_serie.StopBits = StopBits.One;
  24.             Puerto_serie.DataBits = 8;
  25.             Puerto_serie.Handshake = Handshake.None;
  26.             Puerto_serie.RtsEnable = true;
  27.  
  28.             // Establecer los tiempos de espera de lectura / escritura.
  29.             Puerto_serie.ReadTimeout = 500; // Milisegundos.
  30.             Puerto_serie.WriteTimeout = 500;
  31.  
  32.             // Detecta cualquier dato recibido.
  33.             Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  34.  
  35.             Puerto_serie.Open(); // Abrir puerto.
  36.  
  37.             ConsoleKey tecla;
  38.             Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");
  39.  
  40.             do
  41.             {
  42.                 tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.
  43.  
  44.                 switch (tecla)
  45.                 {
  46.                     case ConsoleKey.D1: // Tecla 1 del teclado estandar.
  47.                     case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
  48.                         byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
  49.                         Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
  50.                         break;
  51.  
  52.                     case ConsoleKey.D2:
  53.                     case ConsoleKey.NumPad2:
  54.                         byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
  55.                         Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
  56.                         break;
  57.  
  58.                     default:
  59.                         Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
  60.                         break;
  61.                 }
  62.             }
  63.  
  64.             // Pulsa Escape para salir del menú.
  65.             while (tecla != ConsoleKey.Escape);
  66.  
  67.             Console.WriteLine("Presione cualquier tecla para terminar...");
  68.             Console.WriteLine();
  69.             Console.ReadKey(); // Espera pulsar una tecla cualquiera.
  70.             Puerto_serie.Close(); // Cierra el puerto serie.
  71.         }
  72.  
  73.     // Detecta cualquier dato entrante.
  74.     private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  75.         {
  76.             SerialPort sp = (SerialPort)sender;
  77.             string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  78.             Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
  79.         }
  80.     }
  81. }

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
  1. #include <iostream>
  2. #include <fstream>
  3. #include <Windows.h>
  4. #include "SerialClass.h"
  5. using namespace std;
  6.  
  7. void main()
  8. {
  9.     // Título de la ventana
  10.     SetConsoleTitle("Control Led Arduino.");
  11.  
  12.     // Puerto serie.
  13.     Serial* Puerto = new Serial("COM4");
  14.  
  15.     // Comandos para Arduino.
  16.     char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  17.     char Luz_OFF[] = "Luz_OFF";
  18.     char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
  19.  
  20.     int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.
  21.  
  22.     while (Puerto->IsConnected())
  23.     {
  24.         cout << endl; // Dejamos un retorno.
  25.         cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.
  26.  
  27.         cin >> opc; // Aquí introduces un número, el 1 o el 2.
  28.  
  29.         switch (opc) // Espera recibir un 1 o un 2.
  30.         {
  31.         case 1:
  32.             // Encener luz.
  33.             cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
  34.             Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
  35.             break;
  36.  
  37.         case 2:
  38.             // Apagar luz.
  39.             cout << "Enviando: " << Luz_OFF << endl;
  40.             Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  41.             break;
  42.  
  43.         default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  44.             cout << "Puse del 1 al 2."; // este mensaje.
  45.         }
  46.  
  47.  
  48.         while (true) {
  49.             int n = Puerto->ReadData(lectura, 49);
  50.             if (n > 0) {
  51.                 lectura[n + 1] = '\0';
  52.                 break;
  53.             }
  54.             Sleep(1);
  55.         }
  56.         cout << "Recibido: " << lectura << endl;
  57.         cout << "-------------------" << endl;
  58.         }
  59. }

La idea es que el código de C# tenga el mismo funcionamiento en C++.

¿alguna ayuda?

Saludos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar