Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Pasar código a C++

Estas en el tema de Pasar código a C++ en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 24/03/2017, 08:37
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 702
Antigüedad: 10 años, 1 mes
Puntos: 7
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
  #2 (permalink)  
Antiguo 25/03/2017, 16:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 475
Antigüedad: 6 años, 8 meses
Puntos: 10
Respuesta: Pasar código a C++

Puede ser que te falte un cin >> opc; al final del bucle while?

Algo como:
Código C++:
Ver original
  1. int main()//<----NO void
  2. {
  3. ----------------------
  4.  while (Puerto->IsConnected())
  5.     {
  6.         cout << endl; // Dejamos un retorno.
  7.         cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.
  8.  
  9.         cin >> opc; // Aquí introduces un número, el 1 o el 2.
  10.  
  11.         switch (opc)
  12.         {
  13.         --------------
  14.         }
  15.         while (true)
  16.         {
  17.         -------------
  18.         }
  19.         cin>>opc;
  20.     }
  21.     return 0;//terminar con return
  22. }
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 04/04/2017, 16:03
 
Fecha de Ingreso: febrero-2015
Mensajes: 389
Antigüedad: 2 años, 4 meses
Puntos: 3
Respuesta: Pasar código a C++

Lo que llevas yo lo dejaría asi:
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. int 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.     bool error;
  22.  
  23.     while (Puerto->IsConnected())
  24.     {
  25.         do {
  26.             error=false;
  27.             cout << endl; // Dejamos un retorno.
  28.             cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.
  29.            
  30.             cin >> opc; // Aquí introduces un número, el 1 o el 2.
  31.            
  32.             switch (opc) // Espera recibir un 1 o un 2.
  33.             {
  34.                 case 1: // Encener luz.
  35.                     cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
  36.                     Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
  37.                     break;
  38.  
  39.                 case 2: // Apagar luz.
  40.                     cout << "Enviando: " << Luz_OFF << endl;
  41.                     Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  42.                     break;
  43.                 case 0:
  44.                     salir=true;
  45.                     break;
  46.  
  47.                 default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  48.                     cout << "Puse del 1 al 2."; // este mensaje.
  49.                     error=true;
  50.             }
  51.         }while (error);
  52.         if (!salir){
  53.             int n;
  54.             do {
  55.                n = Puerto->ReadData(lectura, 49);
  56.                if (n > 0) {
  57.                    lectura[n + 1] = '\0';
  58.                }
  59.                Sleep(1);
  60.             }while (n==0);
  61.        
  62.             cout << "Recibido: " << lectura << endl;
  63.             cout << "-------------------" << endl;
  64.         }
  65.     }
  66.     return 0;
  67. }



La zona horaria es GMT -6. Ahora son las 16:24.