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


 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  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 3,920 veces)
Meta


Desconectado Desconectado

Mensajes: 2.968



Ver Perfil WWW
Puerto serie C++. Mejorar el programa.
« en: 16 Marzo 2017, 22:21 »

Buenas:

Tengo un programa aquí que no está bien hecho del todo.

Envía datos al puerto seria, concretamente llega a Arduino. Los datos llegan bien, al recibir, ya no tanto.

Si pulsas la tecla, por ejemplo 5, primero se ve reflejado y luego tengo que pulsar Enter. Lo que quiero lograr es que si pulse el número 5, automáticamente ejecuta la instruacción del case 5 del Switch.

Otra cosa, es que no me llegan los datos desde Arduino cuando le pulso un botón. C++ tiene que ser capaz, desde que le llegue algún dato, reflejarlo en pantalla.

La librería a usar es esta.

https://github.com/Gmatarrubia/LibreriasTutoriales

El código de C++ es:
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <Windows.h>
  4. #include "SerialClass.h"
  5. using namespace std;
  6.  
  7. void main()
  8. {
  9. SetConsoleTitle("Control Led 13 de Arduino UNO y saludos.");
  10.  
  11. Serial* Puerto = new Serial("COM4");
  12.  
  13. while (Puerto -> IsConnected())
  14. {
  15.  
  16. // Comandos para Arduino.
  17. char L_ON[] = "Led13_ON";
  18. char L_OFF[] = "Led13_OFF";
  19. char Saludar[] = "Hola Arduino. Saludos desde el PC con C++ bajo  Win32.";
  20. char Luz_ON[] = "Luz_ON";
  21. char Luz_OFF[] = "Luz_OFF";
  22. char lectura[50];
  23.  
  24. int opc;
  25.  
  26. cout << "Introduzca la opcion deseada: ";
  27.  
  28. cin >> opc;
  29.  
  30. switch (opc)
  31. {
  32. case 1:
  33. cout << "caso 1\n";
  34. // Enviar encender Led.
  35. cout << "Enviando: " << L_ON << endl;
  36. Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);
  37. break;
  38.  
  39. case 2:
  40. cout << "caso 2\n";
  41. // Enviar apagar Led.
  42. cout << "Enviando: " << L_OFF << endl;
  43. Puerto -> WriteData(L_OFF, sizeof(L_OFF) - 1);
  44. break;
  45.  
  46. case 3:
  47. cout << "caso 3\n";
  48. // Mensaje saludar.
  49. cout << "Enviando: " << Saludar << endl;
  50. Puerto -> WriteData(Saludar, sizeof(Saludar) - 1);
  51. break;
  52.  
  53. case 4:
  54. cout << "caso 4\n";
  55. // Mensaje saludar.
  56. cout << "Enviando: " << Luz_ON << endl;
  57. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
  58. break;
  59.  
  60. case 5:
  61. cout << "caso 5\n";
  62. // Mensaje saludar.
  63. cout << "Enviando: " << Luz_OFF << endl;
  64. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  65. break;
  66.  
  67. default:
  68. cout << "Puse del 1 al 5.";
  69. }
  70.  
  71. Puerto -> ReadData(lectura, 50);
  72. cout << "Recibido: " << lectura << endl;
  73.  
  74. cout << "-------------------" << endl;
  75.  
  76. // system("PAUSE");
  77. }
  78. }

¿Alguna ayuda?

Un cordial saludo.

PD: Uso Visual Studio Community 2017, lenguaje C++ bajo Win32.


« Última modificación: 16 Marzo 2017, 22:24 por Meta » En línea

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


Desconectado Desconectado

Mensajes: 3.206


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #1 en: 16 Marzo 2017, 22:45 »

Utilizando el input normal de la consola no puedes hacer esto que comentas.

Lo que sí puedes hacer, es utilizar funciones de WinAPI para obtener las teclas pulsadas, como GetAsyncKeyState. Entonces ya tendrás total control de la consola sin bloqueos para entrada del usuario. Incluso multi-thread si lo necesitases.


En línea

Meta


Desconectado Desconectado

Mensajes: 2.968



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

Hola:

Muchas gracias. Si te digo la verdad, no entiendo ni papa. Jajaajjajajaja. Soy de C# y este C de Win32 o en WinAPI.

Lo que tiene que hacer el programa es enviar este comando que lo hace bien.
Código
  1. cout << "Enviando: " << L_ON << endl;
  2. Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);

Arduino lo detecta.

Luego recibir este comando que no se si lo hace bien. Cuando Arduino le envía mensajes a C++ del PC.
Código
  1. Puerto -> ReadData(lectura, 50);
  2. cout << "Recibido: " << lectura << endl;

Para los que me respondieron en privado lo pongo en público.
Citar
Si hay que usar el Dev C++.


Pues a suarlo.
https://sourceforge.net/projects/orwelldevcpp/

Otros con el Code Blocks, que no se ponen de acuerdo. Para mi solo son IDE y me quedo con Visual studio 2017 que me gusta más. ;)

¿Alguna ayuda?

Saludos.
En línea

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


Desconectado Desconectado

Mensajes: 3.206


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #3 en: 17 Marzo 2017, 00:21 »

"No sabes si lo hace bien"? Pues yo menos ._.

En cualquier caso, mi respuesta iba orientada a:

Si pulsas la tecla, por ejemplo 5, primero se ve reflejado y luego tengo que pulsar Enter. Lo que quiero lograr es que si pulse el número 5, automáticamente ejecuta la instruacción del case 5 del Switch.
Para lo cual, puedes usar la función GetAsyncKeyState de WinAPI.
En al documentación explica su retorno:
Citar
If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down

Por tanto, comprobamos el bit:
Código
  1. if(GetAsyncKeyState(tecla) & 0x8000){
  2.    // Tecla pulsada
  3. }

El código de la tecla es un VirtualKey Code: https://msdn.microsoft.com/es-es/library/windows/desktop/dd375731(v=vs.85).aspx. En cualquier caso, decirte que los codigos de las letras coinciden con los caracteres de las letras mayúsculas:

Código
  1. if(GetAsyncKeyState('A') & 0x8000){
  2.    // Tecla 'A' pulsada
  3. }


Y con respecto a lo del IDE que comentaste, no sé de qué hablabais, pero por supuesto que no importa el IDE.

y bueno, lo dicho:
Citar
Luego recibir este comando que no se si lo hace bien.
Describe qué es lo que no sabes si hace bien y por qué.
En línea

Meta


Desconectado Desconectado

Mensajes: 2.968



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #4 en: 17 Marzo 2017, 02:57 »

Hola Señor:

He hecho el proyecto desde el principio. Como me lía en C++ de Win32, jajajajajja. Y eso que me lo recomendaron mucha gente para aprenerlo, ni viniendo de C#. ;) A lo que íabmos.

La parte donde pone if (GetAsyncKeyState('A') & 0x8000) , precisamente 0x8000 no lo entiendo y no lo pone aquí.

Con este código me aparece el mensaje en pantalla pero no es capaz de enviar algo a Arduino o datos al puerto serie.
Código
  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 13 de Arduino UNO y saludos.");
  11.  
  12. // Nombre del puerto selecconado.
  13. Serial* Puerto = new Serial("COM4");
  14.  
  15. // Variables. Comandos para enviar a Arduino por puerto serie.
  16. char L_ON[] = "Led13_ON";
  17. char L_OFF[] = "Led13_OFF";
  18. char Saludar[] = "Hola Arduino. Saludos desde el PC con C++ bajo  Win32.";
  19. char Luz_ON[] = "Luz_ON";
  20. char Luz_OFF[] = "Luz_OFF";
  21.  
  22. // Para almacenar datos desde el puerto serie.
  23. char lectura[50];
  24.  
  25. // Mostrar texto en pantalla.
  26. cout << "Pulse letra 'A' para endender Led y 'B' para apagar: " << endl;
  27.  
  28. while (Puerto->IsConnected())
  29. {
  30. // Tecla 'A' pulsada
  31. if (GetAsyncKeyState('A') & 0x8000)
  32. {
  33. cout << "Enviando: " << Luz_ON << endl;
  34. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
  35. }
  36.  
  37. // Tecla 'B' pulsada
  38. if (GetAsyncKeyState('B') & 0x8000)
  39. {
  40. cout << "Enviando: " << Luz_OFF << endl;
  41. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  42. }
  43. }
  44.  
  45. system("PAUSE");
  46. }

Parece ser que ignora esta instrucción.
Código
  1. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);

Aquí una captura cuando pulsa solo la B o la A. Se repite muchas veces. (Si es posible hacer el tamaño de la ventana en la programación de C++, mejor que mejor).


Lo de recibir comandos desde el peurto serie o Arduino es este el que me refería:
Código
  1. Puerto -> ReadData(lectura, 50);
  2. cout << "Recibido: " << lectura << endl;

Que este programa al mismo tiempo que envía comandos, también los puede recibir. Si el programa C++ no le hago nada, solo lo dejo arrancado, desde el puerto serie puede venir cualquier dato y C++ debe leerlo sin problemas.

Saludos.
« Última modificación: 17 Marzo 2017, 03:20 por Meta » En línea

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


Desconectado Desconectado

Mensajes: 896



Ver Perfil
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #5 en: 17 Marzo 2017, 10:37 »

Y de parte del arduino cómo lo tienes?
Funciona con hypeterminal?
En línea

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


Desconectado Desconectado

Mensajes: 3.206


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #6 en: 17 Marzo 2017, 13:10 »

La parte donde pone if (GetAsyncKeyState('A') & 0x8000) , precisamente 0x8000 no lo entiendo y no lo pone aquí.
No, no lo pone ahí. Lo pone aquí: https://msdn.microsoft.com/es-es/library/windows/desktop/ms646293(v=vs.85).aspx
Citar
If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down
El bit más significativo en un short es, digamos, ""el de la izquierda"". 0x8000 en binario es 0b1000_0000_0000_0000. Haciendo un and (&), sacamos si ese bit está activo o no. Si está activo, el resultado será diferente de 0, así que se ejecutará el contenido del if. Si no está pulsada, el bit estará a 0, y el AND retornará 0. El if, en ese caso, no se ejecutará.

Parece ser que ignora esta instrucción.
Código
  1. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);

Aquí una captura cuando pulsa solo la B o la A. Se repite muchas veces. (Si es posible hacer el tamaño de la ventana en la programación de C++, mejor que mejor).

Sobre el tema de que se repita muchas veces es porque el GetAsyncKeyState te dice que está pulsada, no si ha sido pulsada. Por tanto, si mantienes la tecla,  entrará muchas veces. Tendrías que controlar si ha sido pulsada ahora o si ya estaba pulsada.

Lo de recibir comandos desde el peurto serie o Arduino es este el que me refería:
Código
  1. Puerto -> ReadData(lectura, 50);
  2. cout << "Recibido: " << lectura << endl;

Que este programa al mismo tiempo que envía comandos, también los puede recibir. Si el programa C++ no le hago nada, solo lo dejo arrancado, desde el puerto serie puede venir cualquier dato y C++ debe leerlo sin problemas.

Como dice MAFUS, esto es un protocolo con 2 programas. Conocemos el de Windows, pero no conocemos el de Arduino. ¿No podría ser problema del programa del Arduino?
En línea

Meta


Desconectado Desconectado

Mensajes: 2.968



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #7 en: 17 Marzo 2017, 14:41 »

Buenos días Señor:

Estuve haciendo pruenas a mi manera, la de poner un número y luego pulsa Enter. Hace cosas raras todavía. Lo raro que hace es almacenar información que viene de Arduino. Lo ideal sería, que si viene algo desde Arduino, se muestre en pantalla de C++, luego se borre, preparado para que llegue otro nuevo mensaje. El truco de las teclas, todavía no me sale.
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <Windows.h>
  4. #include "SerialClass.h"
  5. using namespace std;
  6.  
  7. void main()
  8. {
  9. SetConsoleTitle("Control Led 13 de Arduino UNO y saludos.");
  10.  
  11. Serial* Puerto = new Serial("COM4");
  12.  
  13. while (Puerto -> IsConnected())
  14. {
  15.  
  16. // Comandos para Arduino.
  17. char L_ON[] = "Led13_ON";
  18. char L_OFF[] = "Led13_OFF";
  19. char Saludar[] = "Hola";
  20. char Luz_ON[] = "Luz_ON";
  21. char Luz_OFF[] = "Luz_OFF";
  22. char lectura[50] = "\0";
  23.  
  24. int opc;
  25.  
  26. cout << endl;
  27. cout << "Introduzca la opcion deseada: " << endl << endl;
  28.  
  29. cin >> opc;
  30.  
  31. switch (opc)
  32. {
  33. case 1:
  34. cout << "caso 1\n";
  35. // Enviar encender Led.
  36. cout << "Enviando: " << L_ON << endl;
  37. Puerto -> WriteData(L_ON, sizeof(L_ON) - 1);
  38. break;
  39.  
  40. case 2:
  41. cout << "caso 2\n";
  42. // Enviar apagar Led.
  43. cout << "Enviando: " << L_OFF << endl;
  44. Puerto -> WriteData(L_OFF, sizeof(L_OFF) - 1);
  45. break;
  46.  
  47. case 3:
  48. cout << "caso 3\n";
  49. // Mensaje saludar.
  50. cout << "Enviando: " << Saludar << endl;
  51. Puerto -> WriteData(Saludar, sizeof(Saludar) - 1);
  52. break;
  53.  
  54. case 4:
  55. cout << "caso 4\n";
  56. // Mensaje saludar.
  57. cout << "Enviando: " << Luz_ON << endl;
  58. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);
  59. break;
  60.  
  61. case 5:
  62. cout << "caso 5\n";
  63. // Mensaje saludar.
  64. cout << "Enviando: " << Luz_OFF << endl;
  65. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  66. break;
  67.  
  68. default:
  69. cout << "Puse del 1 al 5.";
  70. }
  71.  
  72. cout << endl;
  73. Puerto->ReadData(lectura, 50);
  74. cout << "Recibido: " << lectura << endl;
  75. lectura[0] = 0; // Limpiar.
  76. cout << "-------------------" << endl;
  77.  
  78. //system("PAUSE");
  79. }
  80. }

Código de Arduino perfectamente funcional con su LCD Keypad Shield incluido.
Código
  1. #include <LiquidCrystal.h>
  2.  
  3. // Inicializa la librería con sus pines indicados.
  4. // RS, RW, Enable, D4, D5, D6, D7.
  5. LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
  6.  
  7. // Pin 10 para saber que es luz de fondo.
  8. const byte LuzFondo = 10;
  9.  
  10. bool estadoActual = false, estadoUltimo = false, contador = false;
  11. const byte pinLed = 13;   // Declaramos la variable pin del Led.
  12. const byte boton = 2;
  13. char caracter;
  14. String comando;
  15.  
  16. void setup()
  17. {
  18.  pinMode(pinLed, OUTPUT);  // Inicializa el pin del LED como salida:
  19.  pinMode(boton, INPUT);    // Pulsador del pin 2.
  20.  Serial.begin(115200);     // Puerto serie 115200 baudios.
  21.  lcd.begin(16, 2);         // Formato de pantalla.
  22.  //digitalWrite(LuzFondo, HIGH);
  23.  lcd.setCursor(0, 0);      // Posición en la pantalla.
  24.  lcd.print("    Arduino     ");
  25.  delay(1000);
  26. }
  27.  
  28. void loop()
  29. {
  30.  /* Leyendo carácter a carácter lo que se resive por el canal del puerto serie
  31.     y los voy concatenando uno tras otro en una cedena. */
  32.  while (Serial.available() > 0)
  33.  {
  34.    caracter = Serial.read();
  35.    comando.concat(caracter);
  36.    delay(10);
  37.  }
  38.  
  39.  estadoActual = digitalRead(boton); // Guarda el estado del pulsador.
  40.  delay(50); // Retardo de 50 mili segundos par evitar antirebotes.
  41.  
  42.  // ¿Pulsador y estadoActual y negación del estadoUltimo es verdadero?
  43.  if (estadoActual && !estadoUltimo)
  44.  {
  45.    contador = !contador;   // Cambio el estado tipo boleano.
  46.  
  47.    if (contador)
  48.    {
  49.      digitalWrite(LuzFondo, HIGH);
  50.      Serial.write("ON");
  51.      lcd.setCursor(15, 0);
  52.      lcd.print("1");
  53.    }
  54.    else
  55.    {
  56.      digitalWrite(LuzFondo, LOW);
  57.      Serial.write("OFF");
  58.      lcd.setCursor(15, 0);
  59.      lcd.print("0");
  60.    }
  61.  }
  62.  
  63.  // Pasa del estadoActual a estadoUltimo.
  64.  estadoUltimo = estadoActual;
  65.  
  66.  // Si los carácteres es recibido y verdadero.
  67.  if (comando.equals("Led13_ON") == true)
  68.  {
  69.    digitalWrite(pinLed, HIGH); // Enciende el Led.
  70.    Serial.write("Led 13 encendido.");
  71.    lcd.setCursor(0, 1);
  72.    lcd.print("Led 13 encendido");
  73.  }
  74.  
  75.  // Si los carácteres es recibido y verdadero.
  76.  if (comando.equals("Led13_OFF") == true)
  77.  {
  78.    digitalWrite(pinLed, LOW); // Apaga el Led.
  79.    Serial.write("Led 13 apagado  ");
  80.    lcd.setCursor(0, 1);
  81.    lcd.print("Led 13 apagado. ");
  82.  }
  83.  
  84.  // Mensaje de saludo.
  85.  if (comando.equals("Hola") == true)
  86.  {
  87.    Serial.write("Hola C++ de Win32. Saludos desde Arduino.");
  88.    lcd.setCursor(0, 1);
  89.    lcd.print("Hola C++ de Win32. Saludos desde Arduino.");
  90.  }
  91.  
  92.  if (comando.equals("Luz_ON") == true)
  93.  {
  94.    digitalWrite(LuzFondo, HIGH); // Apaga el Led.
  95.    Serial.write("Luz ON.");
  96.    lcd.setCursor(0, 1);
  97.    lcd.print("Luz ON.         ");
  98.  }
  99.  
  100.  
  101.  if (comando.equals("Luz_OFF") == true)
  102.  {
  103.    digitalWrite(LuzFondo, LOW); // Apaga el Led.
  104.    Serial.write("Luz OFF.");
  105.    lcd.setCursor(0, 1);
  106.    lcd.print("Luz OFF.        ");
  107.  }
  108.  
  109.  // Limpiamos la cadena para volver a recibir el siguiente comando.
  110.  comando = "";
  111. }
  112.  

Si tengo la ventana de C++, pulso el botón desde Arduino, me tiene que llegar un mensaje, solo llega un ON o un OFF. No muestra nada en C#, solo se acumula en la variable lenguaje, que si envío algo, se suma el ON o OFF más otros mensajes.

Si no entiendes a lo que hablo, me lo dices y lo explico de otra manera.

Saludos.
En línea

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


Desconectado Desconectado

Mensajes: 3.206


ASMático


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

El "truco" d elas teclas, es lo mismo que el digitalRead que tienes ahí. Puedes guardar su estado anterior, no más.

Citar
No muestra nada en C#, solo se acumula en la variable lenguaje
¿C#? ¿Variable lenguaje?

En cualquier caso. ¿Tu problema es que no recibes datos del Arduino? Entonces comenta el switch y testealo por separado.
En línea

Meta


Desconectado Desconectado

Mensajes: 2.968



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #9 en: 18 Marzo 2017, 00:08 »

Buenas:

Quiero decir C++. ;)

Empecé otro proyecto más sencillo, primero corregir lo de recepción del puerto.
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. while (Puerto->IsConnected())
  22. {
  23.  
  24. // Comandos para Arduino.
  25. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  26. char Luz_OFF[] = "Luz_OFF";
  27. char lectura[50]; // Guardan datos de entrada del puerto.
  28. int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.
  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. // Mensaje saludar.
  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. // Mensaje saludar.
  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. cout << endl; // Dejamos un retorno.
  54. Puerto->ReadData(lectura, 50); // Recibe datos desde el puerto y lo almacena en la variable "lectura".
  55. cout << "Recibido: " << lectura << endl; // Muestra en pantalla el texto o datos almacenado en la variable "lectura".
  56. cout << "-------------------" << endl;
  57. }
  58. }
  59.  

Lo ejecuto y muestra exactamente esto:


¿Por qué en recibido aparece esos caracteres raros?

La manera para que no me salga es esto, cambiando de esta manera la variable lectura, colocarle un \0.
Código
  1. // Comandos para Arduino.
  2. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  3. char Luz_OFF[] = "Luz_OFF";
  4. char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
  5. int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.
  6.  

Quiero ir por partes, resolver cada problema. Ahora, no se si lo que hice arriba es lo más indicado. Creo que no, porque si pulso 1 me muestra este resultado:


Si vuelvo a pulsar 1, ya me muestra el Recibido: bien como indica abajo:


Tiene que funcionar todo a la primera. Antes de hacer lo de las teclas, primero resolver este acertijo.  ;)

Saludos.
« Última modificación: 18 Marzo 2017, 00:10 por Meta » 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 937 Último mensaje 17 Julio 2006, 07:46
por D1e6o!
Puerto serie con C#
.NET
Meta 0 6,603 Último mensaje 6 Agosto 2008, 18:43
por Meta
puerto serie
Programación General
zairillo 2 1,578 Último mensaje 10 Septiembre 2008, 09:49
por zairillo
DLL y puerto serie.
Programación General
piwi 3 5,090 Último mensaje 27 Diciembre 2009, 15:45
por Meta
Puerto serie con F#
.NET
Meta 4 888 Último mensaje 9 Diciembre 2015, 10:39
por Meta
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines