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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  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 28,332 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #30 en: 23 Marzo 2017, 22:37 pm »

La cosa rara que hace es  no volver a la opción principal si no pones un 1 o un 2, desde que pongas otra cosa, no sale de ahí.

La cuestión es como se hace.

Sigo investigando...


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

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.


En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #32 en: 24 Marzo 2017, 07:19 am »

Hola:

A pesar de tener más experiencia con C#, con la idea de pasarlo a C++, he hecho esto.

Código C#:
Código
  1. using System;
  2. using System.Text;
  3. using System.IO.Ports;
  4.  
  5. namespace Envio_y_recepcion_puerto_serie_cs
  6. {
  7.    class Program
  8.    {
  9.        static void Main(string[] args)
  10.        {
  11.            // Título de la ventana.
  12.            Console.Title = "Recibir datos desde Arduino con C#";
  13.  
  14.            // Tamaño ventana consola.
  15.            Console.WindowWidth = 55; // X. Ancho.
  16.            Console.WindowHeight = 18; // Y. Alto.
  17.  
  18.            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  19.            SerialPort Puerto_serie = new SerialPort("COM4");
  20.  
  21.            Puerto_serie.BaudRate = 115200;
  22.            Puerto_serie.Parity = Parity.None;
  23.            Puerto_serie.StopBits = StopBits.One;
  24.            Puerto_serie.DataBits = 8;
  25.            Puerto_serie.Handshake = Handshake.None;
  26.            Puerto_serie.RtsEnable = true;
  27.  
  28.            // Establecer los tiempos de espera de lectura / escritura.
  29.            Puerto_serie.ReadTimeout = 500; // Milisegundos.
  30.            Puerto_serie.WriteTimeout = 500;
  31.  
  32.            // Detecta cualquier dato recibido.
  33.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  34.  
  35.            Puerto_serie.Open(); // Abrir puerto.
  36.  
  37.            ConsoleKey tecla;
  38.            Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");
  39.  
  40.            do
  41.            {
  42.                tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.
  43.  
  44.                switch (tecla)
  45.                {
  46.                    case ConsoleKey.D1: // Tecla 1 del teclado estandar.
  47.                    case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
  48.                        byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
  49.                        Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
  50.                        Console.WriteLine("Enviado: {0}", miBuffer1); // Muestra en pantala el mensaje enviado, en este caso, Luz_ON.
  51.                        break;
  52.  
  53.                    case ConsoleKey.D2:
  54.                    case ConsoleKey.NumPad2:
  55.                        byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
  56.                        Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
  57.                        //Console.WriteLine("Enviado: {0}", miBuffer2);
  58.                        break;
  59.  
  60.                    default:
  61.                        Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
  62.                        break;
  63.                }
  64.            }
  65.  
  66.            // Pulsa Escape para salir del menú.
  67.            while (tecla != ConsoleKey.Escape);
  68.  
  69.            Console.WriteLine("Presione cualquier tecla para continuar...");
  70.            Console.WriteLine();
  71.            Console.ReadKey(); // Espera pulsar una tecla cualquiera.
  72.            Puerto_serie.Close(); // Cierra el puerto serie.
  73.        }
  74.  
  75.    // Detecta cualquier dato entrante.
  76.    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  77.        {
  78.            SerialPort sp = (SerialPort)sender;
  79.            string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  80.            Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
  81.        }
  82.    }
  83. }
  84.  

Es este último código que me funciona mejor, también he intentado que me muestre el valor enviado y me diga en pantalla:

Enviado: Luz_ON


He usado esto para que muestre lo que envía:
Código
  1. Console.WriteLine("Enviado: {0}", miBuffer1);

Su resultado fue este:
Enviado: system.Byte[]

¿Pero qué es esto?

Concretamente aquí:
Código
  1.                    case ConsoleKey.D1:
  2.                    case ConsoleKey.NumPad1:
  3.                        byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON");
  4.                        Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length);
  5.                        Console.WriteLine("Enviado: {0}", miBuffer1);
  6.                        break;

Lo bueno que también ya recibo el ON y OFF si pulso el pulsador dede Arduino directamente. Funciona todo menos lo indicado justo arriba.

Debe aparecer de esta manera: Luz_ON

Aparece en hexadecimales. ;)

Código
  1. Console.WriteLine("Enviado: {0}", BitConverter.ToString(miBuffer1));
Cuando esté listo todo C#, ya se podrá hacer el C++ de una vez por todas, jaaaj ajajajja. Eso espero y se las debo a todos. ;)

PD: No me había dado cuenta que tienes un blog, no sabía que eres un profesional de C++.
« Última modificación: 24 Marzo 2017, 10:08 am por Meta » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #33 en: 24 Marzo 2017, 13:37 pm »

Prueba con:
Código
  1. Encoding.ASCII.GetString(miBuffer1);
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #34 en: 24 Marzo 2017, 13:51 pm »

Buenas:

Lo había probado, da este error:
Citar
no se puede convertir de 'byte[]' a 'char[]'

Bueno, como no es importante, pues lo que tenemos arriba con C# ya se puede hacer una idea de como se puede hacer en C++. Mira que da guerra el C++ de las narices, no me extraña que Java junto con C# desbanque a C++ Win32 como lenguaje principal para un informático.

Empezando otra vez con las grandes aventuras con el C++ de Win32, ;)
Como se puede ver en el código de C# arriba, hay que usar un do while.
https://msdn.microsoft.com/es-es/library/b0kk5few.aspx

Tutorial:




Saludos.
« Última modificación: 24 Marzo 2017, 14:46 pm por Meta » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

Pero si el único problema que tenías era la estructura (que es lo mismo en C++ como en C#) ._.

Y sobre el error, aseg´ñurate de que usas el método correcto: https://msdn.microsoft.com/es-es/library/744y86tc(v=vs.110).aspx
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #36 en: 24 Marzo 2017, 17:51 pm »

Lo más parecido que he hecho es esto.
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <Windows.h>
  4. #include <stdio.h>
  5. #include "SerialClass.h"
  6. using namespace std;
  7.  
  8. void main()
  9. {
  10. // Título de la ventana
  11. SetConsoleTitle("Control Led Arduino.");
  12.  
  13. // Puerto serie.
  14. Serial* Puerto = new Serial("COM4");
  15.  
  16. // Comandos para Arduino.
  17. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  18. char Luz_OFF[] = "Luz_OFF";
  19. char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
  20. int tecla; // Guarda las teclas pulsadas.
  21.  
  22. cout << "Introduzca la opcion deseada: " << endl << endl;
  23. cin >> tecla; // Aquí introduces un número, el 1 o el 2.
  24.  
  25. do
  26. {
  27. while (tecla)
  28. {
  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. }
  44.  
  45. } while (tecla != 0);
  46. }
  47.  
  48.     while (true) {
  49.     int n = Puerto->ReadData(lectura, 49);
  50.     if (n > 0) {
  51.     lectura[n + 1] = '\0';
  52.     break;
  53.     }
  54.     Sleep(1);
  55.     }
  56.  
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #37 en: 24 Marzo 2017, 18:11 pm »

Parecido sí, pero de forma incorrecta:
En C# tienes esto:
Código
  1.            do
  2.            {
  3.                tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.

En C++ tienes esto otro:
Código
  1. cin >> tecla; // Aquí introduces un número, el 1 o el 2.
  2.  
  3. do
  4. {
La diferencia entre uno y otro es que el C++ va a quedarse en un bucle infinito.

Y pusiste:
Código
  1. while (tecla)
  2. {
  3. case 1:
._.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #38 en: 24 Marzo 2017, 18:46 pm »

Buenas:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <Windows.h>
  4. #include <stdio.h>
  5. #include "SerialClass.h"
  6. using namespace std;
  7.  
  8. void main()
  9. {
  10. // Título de la ventana
  11. SetConsoleTitle("Control Led Arduino.");
  12.  
  13. // Puerto serie.
  14. Serial* Puerto = new Serial("COM4");
  15.  
  16. // Comandos para Arduino.
  17. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  18. char Luz_OFF[] = "Luz_OFF";
  19. char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
  20. int tecla; // Guarda las teclas pulsadas.
  21.  
  22. cout << "Introduzca la opcion deseada: " << endl << endl;
  23.  
  24.  
  25. do
  26. {
  27. cin >> tecla; // Aquí introduces un número, el 1 o el 2.
  28.  
  29. while (tecla)
  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. } while (tecla != 0);
  48.  
  49. while (true) {
  50. int n = Puerto->ReadData(lectura, 49);
  51. if (n > 0) {
  52. lectura[n + 1] = '\0';
  53. break;
  54. }
  55. Sleep(1);
  56. }
  57. }

Como no se como se llaman las cosas en C++, ya me atasqué. En C# funciona todo bien. ;)

Ahora si necesito ayuda bien ayuda para sacar esto de una vez. A parte que tengo otro proyecto en mente con lo mismo pero en MFC C++. ;)

Saludos.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #39 en: 24 Marzo 2017, 19:42 pm »

Parecido sí, pero de forma incorrecta:
En C# tienes esto:
Código
  1.            do
  2.            {
  3.                tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.

En C++ tienes esto otro:
Código
  1. cin >> tecla; // Aquí introduces un número, el 1 o el 2.
  2.  
  3. do
  4. {
La diferencia entre uno y otro es que el C++ va a quedarse en un bucle infinito.

Y pusiste:
Código
  1. while (tecla)
  2. {
  3. case 1:
._.
Línea 29.
Código
  1. while (tecla)
No es while, es switch.
En línea

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
Adaptador de puerto de serie a ps2?
Electrónica
jaciga 1 3,962 Último mensaje 18 Abril 2005, 11:38 am
por + enrique ZP
manejo puerto serie
Programación Visual Basic
rulodlb 4 2,233 Último mensaje 12 Noviembre 2005, 13:57 pm
por rulodlb
Ejercicio del puerto SERIE
Electrónica
renga73 1 2,611 Último mensaje 17 Julio 2006, 07:46 am
por D1e6o!
Puerto serie con C#
.NET (C#, VB.NET, ASP)
Meta 0 8,506 Último mensaje 6 Agosto 2008, 18:43 pm
por Meta
Puerto serie con F#
.NET (C#, VB.NET, ASP)
Meta 4 3,986 Último mensaje 9 Diciembre 2015, 10:39 am
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines