Ir al contenido


Foto

Mejorar este código en C++


  • Por favor identifícate para responder
1 respuesta en este tema

#1 Meta

Meta

    Member

  • Miembros
  • PipPip
  • 24 mensajes

Escrito 25 marzo 2017 - 11:45

Hola:

 

Tengo este código hecho en C++ y no me gusta mucho como funciona, se me queda atascado.

 

Lo que hace el programa es, enviar datos al puerto serie, por ejemplo, si pulso la tecla 1 o la tecla 2, envía datos al puerto serie y recibe datos en el cual muestra en pantalla. Si pulso otra tecla que no sea el 1 o el 2, me salta en Default y no sale de ahí, es cuando y está atascado.

 

¿Es posible solucionarlo?


cpp
  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 ((opc == 1) == (opc == 2))
  49. {
  50. int n = Puerto->ReadData(lectura, 49);
  51. if (n > 0)
  52. {
  53. lectura[n + 1] = '\0';
  54. break;
  55. }
  56. Sleep(500);
  57. }
  58.  
  59. cout << "Recibido: " << lectura << endl;
  60. cout << "-------------------" << endl;
  61. }
  62. }

Gracias por su tiempo. ;)


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 26 marzo 2017 - 02:13

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

cpp
  1. 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í:

cpp
  1. 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. 
No puedo probar el código pero cambiaría muchas cosas. Para que te resulte más familiar quédate con estos pequeños cambios:

cpp
  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. cout << endl; // Dejamos un retorno.
  24. cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.
  25.  
  26. cin >> opc; // Aquí introduces un número, el 1 o el 2.
  27.  
  28. switch (opc){ // Espera recibir un 1 o un 2.
  29. case 1:
  30. // Encener luz.
  31. cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
  32. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
  33. break;
  34.  
  35. case 2:
  36. // Apagar luz.
  37. cout << "Enviando: " << Luz_OFF << endl;
  38. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  39. break;
  40.  
  41. default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  42. cout << "Puse del 1 al 2."; // este mensaje.
  43. continue;
  44. }
  45.  
  46. if ((opc == 1) || (opc == 2)){
  47. int n = Puerto->ReadData(lectura, 49);
  48. if (n > 0)
  49. lectura[n + 1] = '\0';
  50. }
  51.  
  52. cout << "Recibido: " << lectura << endl;
  53. cout << "-------------------" << endl;
  54. }
  55. }

Saludos.
  • 1




IP.Board spam blocked by CleanTalk.