elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Puerto serie C++. Mejorar el programa.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 4 5 [6] 7 8 Ir Abajo Respuesta Imprimir
Autor Tema: Puerto serie C++. Mejorar el programa.  (Leído 4,811 veces)
Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #50 en: 25 Marzo 2017, 23:24 »

¿Y cómo se resuelve est e problema?

¿Enviando algo a Arduino que no sea 1 o el 2? ;)

Así no me va, jajajaja. Mejor que C++ controle la situación y estoy que arde de no lograrlo.


En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
MAFUS


Desconectado Desconectado

Mensajes: 924



Ver Perfil
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #51 en: 25 Marzo 2017, 23:53 »

Cambia todo el while(true) por:
Código
  1. Sleep(500);
  2. int n = Puerto->ReadData(lectura, 49);
  3. if (n > 0) {
  4.    lectura[n + 1] = '\0';
  5.    cout << "Recibido: " << lectura << endl;
  6.    cout << "-------------------" << endl;
  7. }


En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
ivancea96


Desconectado Desconectado

Mensajes: 3.295


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #52 en: 26 Marzo 2017, 00:20 »

En primer lugar, yo separaría estoa  una función:

Código
  1. while (true) {
  2. int n = Puerto->ReadData(lectura, 49);
  3. if (n > 0) {
  4. lectura[n + 1] = '\0';
  5. break;
  6. }
  7. Sleep(1);
  8. }
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:
Código
  1. const char *luz[2] = {"Luz_ON", "Luz_OFF"};
  2.  
  3. switch(opc){
  4.    case 1:
  5.    case 2:
  6.        cout << "Enviando: " << luz[opc-1] << endl;
  7.        Puerto->WriteData(luz[opc-1], strlen(luz[opc-1]));
  8.        cout << "Respuesta: " << obtenerRespuestaArduino() << endl;
  9.        break;
  10.  
  11.    default:
  12.        // ...
  13. }

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.

Ya ahí te respondiera el cómo solucionarlo -.-'
En línea

Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #53 en: 26 Marzo 2017, 08:39 »

Por fiiiiiiiiiiiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnn.

Código
  1. // Para crear conexión con los puertos COM1 - COM9.
  2. // Serial* Arduino = new Serial("COM7");
  3.  
  4. // Para crear conexión con los puertos COM10 en adelante.
  5. // Serial* Arduino = new Serial("\\\\.\\COM10");
  6.  
  7. #include <iostream>
  8. #include <fstream>
  9. #include <Windows.h>
  10. #include "SerialClass.h"
  11. using namespace std;
  12.  
  13. void main()
  14. {
  15. // Título de la ventana
  16. SetConsoleTitle("Control Led Arduino.");
  17.  
  18. // Puerto serie.
  19. Serial* Puerto = new Serial("COM4");
  20.  
  21. // Comandos para Arduino.
  22. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  23. char Luz_OFF[] = "Luz_OFF";
  24. char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
  25.  
  26. int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.
  27.  
  28. while (Puerto->IsConnected())
  29. {
  30. cout << endl; // Dejamos un retorno.
  31. cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.
  32.  
  33. cin >> opc; // Aquí introduces un número, el 1 o el 2.
  34.  
  35. switch (opc) // Espera recibir un 1 o un 2.
  36. {
  37. case 1:
  38. // Encener luz.
  39. cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
  40. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
  41. break;
  42.  
  43. case 2:
  44. // Apagar luz.
  45. cout << "Enviando: " << Luz_OFF << endl;
  46. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  47. break;
  48.  
  49. default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  50. cout << "Puse del 1 al 2."; // este mensaje.
  51. }
  52.  
  53.  
  54. Sleep(500);
  55. int n = Puerto->ReadData(lectura, 49);
  56. if (n > 0)
  57. {
  58. lectura[n + 1] = '\0';
  59. cout << "Recibido: " << lectura << endl;
  60. cout << "-------------------" << endl;
  61. }
  62. }
  63. }

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
  1. default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  2. cout << "Puse del 1 al 2."; // este mensaje.

Saludos.
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
MAFUS


Desconectado Desconectado

Mensajes: 924



Ver Perfil
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #54 en: 26 Marzo 2017, 09:59 »

Vacía el buffer cin después de obtener el dato.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #55 en: 26 Marzo 2017, 10:22 »

Hola:

Lo he intentado así:
Código
  1. default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  2. cout << "Puse del 1 al 2."; // este mensaje.
  3. }
  4.  
  5.  
  6. Sleep(500);
  7. int n = Puerto->ReadData(lectura, 49);
  8. if (n > 0)
  9. {
  10. lectura[n + 1] = '\0';
  11. cout << "Recibido: " << lectura << endl;
  12. cout << "-------------------" << endl;
  13. }
  14.  
  15. opc = NULL; // Vaciar el buffer.
  16. }
  17. }

Actúa de la misma manera.
« Última modificación: 26 Marzo 2017, 10:38 por Meta » En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
MAFUS


Desconectado Desconectado

Mensajes: 924



Ver Perfil
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #56 en: 26 Marzo 2017, 12:32 »

Pásate por aquí.  Miestra varias formas de vaciar cin.
http://www.cplusplus.com/forum/general/11070/
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #57 en: 26 Marzo 2017, 13:25 »

Hola:

Voy a probar, mientras hay que entretenerse actualizarse del futuro C++ 17 y C++ 20.


Usé esto:
Código
  1. Sleep(250);
  2. int n = Puerto->ReadData(lectura, 49);
  3. if (n > 0)
  4. {
  5. lectura[n + 1] = '\0';
  6. cout << "Recibido: " << lectura << endl;
  7. cout << "-------------------" << endl;
  8. }
  9.  
  10. cin.sync(); // Limpiar.
  11. }
  12. }

Ese no es el problema, todo funciona bien menos una cosa.

Si escribo letras, se vuelve loco. Si escribo cualquier número, funciona de maravilla.
Saludos.
« Última modificación: 26 Marzo 2017, 13:50 por Meta » En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
ivancea96


Desconectado Desconectado

Mensajes: 3.295


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #58 en: 26 Marzo 2017, 17:53 »

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.

Usando el operator bool:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(){
  6. while(true){
  7. int n;
  8. cin >> n;
  9. if(!cin){
  10. cout << "Error" << endl;
  11. cin.clear();
  12. cin.sync();
  13. }else{
  14. cout << "Ok: " << n << endl;
  15. }
  16. }
  17. }
En línea

Meta


Desconectado Desconectado

Mensajes: 2.997



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #59 en: 26 Marzo 2017, 18:23 »

Entendido. Muy buena explicación.

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)) ===|



En Visual Studio 2017 funciona muy bien.

En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Páginas: 1 2 3 4 5 [6] 7 8 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ejercicio del puerto SERIE
Electrónica
renga73 1 963 Último mensaje 17 Julio 2006, 07:46
por D1e6o!
Puerto serie con C#
.NET
Meta 0 6,691 Último mensaje 6 Agosto 2008, 18:43
por Meta
puerto serie
Programación General
zairillo 2 1,632 Último mensaje 10 Septiembre 2008, 09:49
por zairillo
DLL y puerto serie.
Programación General
piwi 3 5,199 Último mensaje 27 Diciembre 2009, 15:45
por Meta
Puerto serie con F#
.NET
Meta 4 962 Último mensaje 9 Diciembre 2015, 10:39
por Meta
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines