desktop

Rehacer código de C# a C++

Hola:

Tengo hecho un programa en C# para leer y enviar datos al puerto serie. En C# me funciona, quiero pasarlo al C++ y como no estoy familiarizado con C++, me cuesta hacer hasta lo más básico. Aquí dejo el código de C# para me me ayuden si es posinle, pasarlo de C# a C++.

El programa de C++ lo tengo hecho pero funciona a medias.

Código C#:
Código:
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.
        }
    }
}

Código C++:
Código:
// Para crear conexión con los puertos COM1 - COM9.
// Serial* Arduino = new Serial("COM7");

// Para crear conexión con los puertos COM10 en adelante.
// Serial* Arduino = new Serial("\\\\.\\COM10");

#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;
        }
}

En C++ he hecho lo que puse, usé esta librería y Visual Studio Community 2017.

¿Alguna idea?

Saludos.
 
Hola
Hola:

Tengo hecho un programa en C# para leer y enviar datos al puerto serie. En C# me funciona, quiero pasarlo al C++ y como no estoy familiarizado con C++, me cuesta hacer hasta lo más básico. Aquí dejo el código de C# para me me ayuden si es posinle, pasarlo de C# a C++. . . .
Eso que estas tratando de hacer ., lo reliza el AVRstudio 7 automaticamente​
Como haci la forma inversa ., fijate en tutoriales de como importar compilaciones de arduino en AVRstudio 7​
 
Última edición por un moderador:
no no no
lo que esta tratando de hacer es una aplicacion tipo consola para visual studio
¿para que regresar a CIN COUT?
no me acuerdo bien pero visual studio usa otra direcctiva diferente a cin y cout por eso no te funciona
 
Si funciona, solo hay que programarlo bien.

Hice uno atrás que funciona pero no como debería.
Código:
#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;
        }
}

Puedo enviar y recibir datos. Si lo dejo quieto, y pulso el botón de Arduino, no recibe nada porque no está preparado para ello y en C++ no se hacerlo.

¿Por qué lo hago en consola?

Porque es bueno tenerlo en consola y en Visual, en formulario. Cuando lo acaben en consola, intentaré pasarlo a Visual. Tendré los dos formatos.

Saludos.
 
Última edición:
Que si pulsas un número que no se al 1 o el 2, se queda ahí.
El otro fallo es que si recibe dato alguno desde el puerto serie, no hace nada.

Tecnicamente no hay fallos al compilar, solo que no se programarlo bien.
 
Atrás
Arriba