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

 

 


Tema destacado: Introducción a Git (Primera 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,335 veces)
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

El caso es que, este mismo código en C#, también dará problema. No es cosa del lenguaje, sinó de la lógica. Si tu switch va por el default, le estás obligando igualmente a leer datos del Arduino (que no tiene por qué haber).

Si lo que quieres es enviarle datos y leerlos a la vez, necesitarás threads.


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #21 en: 19 Marzo 2017, 22:06 pm »

Con hilos se complica un poco. Debes estar seguro de no recibir y emitir al mismo tiempo.

Pero si el arduino solo contesta a los comandos que recibe en el mismo case se emite el comando y se espera la respuesta.

Otra forma sería emulando la forma de trabajar de un PLC: se mira si hay algo de comunicación externa; se controlan las entradas; se calcula lo que se deba, se escriben las salidas; se escriben las comunicaciones externas.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

Con hilos se complica un poco. Debes estar seguro de no recibir y emitir al mismo tiempo.

Pero si el arduino solo contesta a los comandos que recibe en el mismo case se emite el comando y se espera la respuesta.

Otra forma sería emulando la forma de trabajar de un PLC: se mira si hay algo de comunicación externa; se controlan las entradas; se calcula lo que se deba, se escriben las salidas; se escriben las comunicaciones externas.

Uy uy, que catastrofista  >:D
Realmente, utilizando GetAsyncKeyState() y 2 mutex (uno para la salida por consola y otro para el Serial), está sincronizado.
O al menos lo estaría si el protocolo PC-Arduino fuera más preciso, vaya. Porque como escriba el PC al Arduino y el Arduino al PC a la vez, el PC se tomará lo del Arduino como respuesta xD
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



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

Si fuera puerto serie puro se podrían usar las líneas CTS y RTS, pero al ser emulado no sé si existen.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

O directamente, poniendole un "header" a los mensjaes:
Código:
~~ Arduino -> PC

<msg_type:1 byte>

(msg_type=1){
    ~~ Botón pulsado
    <datos:string>
}
(msg_type=2){
    ~~ Respuesta al PC
    <datos:string>
}
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #25 en: 20 Marzo 2017, 05:29 am »

Hola:

Probando con C# se funciona la recepción de datos, en C++ con Win32 no tengo idea como se hace. ;)
Código
  1. using System;
  2. using System.IO.Ports;
  3.  
  4. namespace Envio_y_recepcion_puerto_serie_cs
  5. {
  6.    class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.            // Título de la ventana.
  11.            Console.Title = "Recibir datos desde Arduino con C#";
  12.  
  13.            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  14.            SerialPort Puerto_serie = new SerialPort("COM4");
  15.  
  16.            Puerto_serie.BaudRate = 115200;
  17.            Puerto_serie.Parity = Parity.None;
  18.            Puerto_serie.StopBits = StopBits.One;
  19.            Puerto_serie.DataBits = 8;
  20.            Puerto_serie.Handshake = Handshake.None;
  21.            Puerto_serie.RtsEnable = true;
  22.  
  23.            // Detecta cualquier dato recibido.
  24.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  25.  
  26.            Puerto_serie.Open(); // Abrir puerto.
  27.  
  28.            Console.WriteLine("Presione cualquier tecla para continuar...");
  29.            Console.WriteLine();
  30.            Console.ReadKey(); // Espera pulsar una tecla cualquiera.
  31.            Puerto_serie.Close(); // Cierra el puerto serie.
  32.        }
  33.  
  34.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  35.        {
  36.            SerialPort sp = (SerialPort)sender;
  37.            string indata = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  38.            Console.WriteLine("Dato recibido desde Arduino: " + indata); // Muestra en pantalla los datos recibidos.
  39.        }
  40.    }
  41. }



Para enviar datos si el puerto en C# es así:
Código
  1. byte[] mBuffer = Encoding.ASCII.GetBytes("Hola mundo");
  2.    serialPort1.Write(mBuffer, 0, mBuffer.Length)

En C# lo hago rápido, deja acabarlo por completo y luego haber si es posible traducirlo al C++. ;)

Sigo investigando...
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

El problema es la estructura del programa. Si te es más cómodo, hazlo en C#, y ya luego traduces.

De todos modos, trata de no usar handles. Maneja tú el flujo del programa. Sinó luego, al pasarlo a C++, va a ser más complicado.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #27 en: 20 Marzo 2017, 13:27 pm »

Claro que el evento te controla el puerto pero eso lo debes hacer a mano.
Podrías crear un hilo que vaya monitorizando si el puerto ha recibido algo y te disparara una función, ese sería tu evento.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Puerto serie C++. Mejorar el programa.
« Respuesta #28 en: 23 Marzo 2017, 06:45 am »

Hola:

Viendo lo visto, no he digo capaz, al menos por ahora, hacer un menú con fundamento para que me salga en C#, sigo con ello en paralelo ha este por si acaso. Me centraré en que si pulsas una tecla, directamente envía datos al puerto serie.

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. while (true) {
  55. int n = Puerto->ReadData(lectura, 49);
  56. if (n > 0) {
  57. lectura[n + 1] = '\0';
  58. break;
  59. }
  60. Sleep(1);
  61. }
  62. cout << "Recibido: " << lectura << endl;
  63. cout << "-------------------" << endl;
  64. }
  65. }

Habías comentado algo así:
Código
  1. // Tecla 'B' pulsada
  2. if (GetAsyncKeyState('B') & 0x8000)
  3. {
  4. // Apagar luz.
  5. cout << "Enviando: " << Luz_OFF << endl;
  6. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  7. }

Pero no funcionaba, daba cosas raras.

Me conformo lo de enviar datos al puerto serie y acto seguido responde desde Arduino, hasta ahí bien, solo falta pulsar una tecla, desde que detecta la tecla, a enviar datos, no que primero pulse una tecla, luego Enter para enviar datos como hasta ahora.

;)
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


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

Citar
Pero no funcionaba, daba cosas raras.
"Cosas raras" xD
El problema de ponerlo directamente así, es que si pulsas una letra, mientras la tengas pulsada, va a ser true ese if, con lo que entrará muchas veces seguidas.
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