Una función que espere a que el Arduino envíe datos, y los retorne.
Lo de esperar datos solo lo vas a hacer si pulsan 1 o 2, así que llamas a esa función en cada case. Es cierto que los 2 case son idénticos salvo por la constante que envías. Podrías poner algo como:
De ese modo, solo esperará entrada del Arduino cuando sea necesario hacerlo. Al terminar el switch, puedes poner, si quieres, para leer datos del Arduino (sin esperar indefinidamente, eso sí, para que vuelva al inicio del bucle while y siga preguntando)
El problema es eso, el cómo está estructurado el código. Lo dicho: si tienes más experiencia en C#, puedes tratar de hacerlo ahí primero.
// 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"
usingnamespace 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.
{
case1:
// 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;
case2:
// 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.
}
Sleep(500);
int n = Puerto->ReadData(lectura, 49);
if(n >0)
{
lectura[n +1]='\0';
cout<<"Recibido: "<< lectura << endl;
cout<<"-------------------"<< endl;
}
}
}
A pesar de que funciona bien en apariencia, hay que seguir mejorando ya que si pulso una letra, sale un bucle repetitivo en default, no sale de ahí ni loco.
@ ivancea96 : La abreviación que hiciste para ahorrar código está muy curioso, antes debo resolver problemas indicado arriba, a parte de eso, lo de pulsar una tecla y automáticamente ejecuta el envio.
¿Cómo resolvemos el bucle este si pulso letras?
Código
default:// Si haz pulsado otro número distinto del 1 y 2, muestra
La abreviación que hiciste para ahorrar código está muy curioso, antes debo resolver problemas indicado arriba, a parte de eso, lo de pulsar una tecla y automáticamente ejecuta el envio.
No era una abreviación, era la forma de corregir el flujo del programa :/
Si escribo letras, se vuelve loco. Si escribo cualquier número, funciona de maravilla.
Al usar el operator>> de istream (cin), le estás pasando una variable numérica. Si no recibe una entrada válida, pone activa alguna de sus flags internas: http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/ Para ver si está la flag de error (la que te interesa en este caso), tienes el método fail(). Si quieres ver si hay errores de cualquier tipo, tienes el operator bool de la clase ios.
Fíjate que fuí a probar el código en CODE::BLOCKS para saber como se comporta, más bien creyendo que funconaría igual y me da errores por todas partes.
Citar
||=== Build: Debug in Arduino_Led (compiler: GNU GCC Compiler) ===| C:\Users\Meta\Documents\Code Blocks\Arduino_Led\Arduino_Led\main.cpp|13|error: '::main' must return 'int'| C:\Users\Meta\Documents\Code Blocks\Arduino_Led\Arduino_Led\main.cpp||In function 'int main()':| C:\Users\Meta\Documents\Code Blocks\Arduino_Led\Arduino_Led\main.cpp|19|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]| ||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|