Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Cambiar este código C++ (https://www.clubdelphi.com/foros/showthread.php?t=91633)

REHome 23-03-2017 14:23:40

Cambiar este código C++
 
Hola:

El programa que quiero es:

1. Si pulso un número 1 o un 2 en C++, envía un mensaje a Aduino, luego Arduino le devuelve un mensaje.

2. Si pulso otro número que no está en el Switch Case, te salta el mensaje Default inficando que solo hay dos opciones para pulsar, tecla 1 y 2. Si pulso un 3 o otro valor que no existe, se queda elprograma C++ como esperando y no hace nada.

3. Si no se pulsa nada desde C++, Arduino tiene un botón, que al pulsarlo, envía mensajes llamado, ON o un OFF, C++ debe leer, nunca los lee.

Uso el IDE de Visual Studio 2017 en Win32 consola.

El código C++ que debo mejorar y no se como hacerlo lo que pido arriba:
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;
      }
}

Su librería es esta.
https://github.com/Gmatarrubia/LibreriasTutoriales

¿Alguna ayuda?

Llevo dos semanas con esto, ajjaa ajaj ja jaja. Al menos he logrado enviar y recibir algo, pero no sale como quiero.

Saludos.

escafandra 26-03-2017 10:20:21

El error fundamental que te bloquea el código es esta línea:*
Código PHP:

while ((opc == 1) == (opc == 2)) 

Fíjate en la lógica, tu quieres que entre en el bucle si opc es 1 ó 2 pero ocurre esto:
- si opc es 1 ó 2 no entra en el bucle puesto que la condición es falsa.
- si opc no es 1 ni 2, la condición del bucle es cierta, entra y no sale. Esto lo resuelves así:
Código PHP:

while ((opc == 1) || (opc == 2)) // || es el operador "or" lógico 

Pero poner ahí un bucle es otro error, deberías poner un simple condicional:
Código PHP:

if ((opc == 1) || (opc == 2)){
      
int n Puerto->ReadData(lectura49);
      if (
0)
        
lectura[1] = '\0';


Saludos.


La franja horaria es GMT +2. Ahora son las 13:56:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi