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, K-YreX)
| | |-+  Elegir el evento exacto
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Elegir el evento exacto  (Leído 8,556 veces)
Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Elegir el evento exacto
« en: 26 Julio 2017, 01:14 am »

Hola:

He creado un evento. Se trata de usar el código correcto para que al recibir datos por el puerto serie, lo detecte y lo muestre en patalla.


Uso la ibrería https://github.com/Gmatarrubia/LibreriasTutoriales

El evento generado es este:
Código
  1. void CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino()
  2. {
  3.  
  4. }

Introduje este código. Lo que debe hacer es, al detectar el puerto serie, se guarde en la variable lectura. Lo que tenga guardado en la variable lectura, lo uestra en el componente Rich del formulario.
Código
  1. void CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino()
  2. {
  3. // TODO:  Si éste es un control RICHEDIT, el control no
  4. // enviará esta notificación a menos que se invalide CDialogEx::OnInitDialog()
  5. // función para enviar el mensaje EM_SETEVENTMASK al control
  6. // con la marca ENM_UPDATE ORed en la máscara lParam.
  7.  
  8. // TODO:  Agregue aquí el controlador de notificación de controles.
  9.  
  10. int n = Puerto->ReadData(lectura, 49);
  11. if (n > 0)
  12. {
  13. lectura[n + 1] = '\0';
  14. IDC_EDIT_MENSAJE_DESDE_ARDUINO->text = lectura;
  15. }
  16. }

Al compilar me da dos erroes.
Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error (activo)   E0044   la expresión debe tener un tipo de puntero   MFC_Arduino   c:\Users\usuario\Documents\Visual Studio 2017\Projects\MFC_Arduino\MFC_Arduino\MFC_ArduinoDlg.cpp   155   



Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   C2227   el operando izquierdo de '->text' debe señalar al tipo class/struct/union/generic   MFC_Arduino   c:\users\meta\documents\visual studio 2017\projects\mfc_arduino\mfc_arduino\mfc_arduinodlg.cpp   155   


¿Alguna solución?

Saludos.

MOD: imagen adaptada a lo permitido.




Edito 3:

Hola de nuevo:

Si me deja escribir por aquí. Leyendo y leyendo por internet, hasta en ruso, encontré este enlace.

SetDlgItemText

En C# sería algo así cmo indiqué arriba, pero no lo es:
Código
  1. Rich.txt = Lectura.toString();

Se usa así:
Código
  1. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura); // Mostrar texto.

En parte me ha funcionado, solo en parte, es decir. Si pulso el botón ON o OFF, no pasa nada. Si escribo una letra en el Rich, aparece ya los textos desde el puerto serie. Vuelvo a pulsar el botón ON o el OFF, no pasa nada, si escribo otra letra en el Rich que se llama IDC_EDIT_MENSAJE_DESDE_ARDUINO, vuelve aparecer nuevos datos desde el puerto serie. Esto ocurre así porque he usado este evento que puedes ver aquí. No encuentro otro evento que valga la pena.

Código de este evento:
Código
  1. void CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino()
  2. {
  3. int n = Puerto->ReadData(lectura, 49);
  4. if (n > 0)
  5. {
  6. lectura[n + 1] = '\0';
  7. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura);
  8. }
  9. }

Si escribo una letra, en el Rich, me aparece por fin el mensaje, solo si escribe una letra, lo que sea con tal de detectar algo. Por lo que se ve, este método no es el adecuado.


Hice otro truco a ver si cuela, pero tampoco funciona como quiero. Puede el código en cada botón, el ON y OFF, usando el mismo código, y sin usar el void para reutilización de código, no quería perder el tiempo.
Código
  1. void CMFC_ArduinoDlg::OnBnClickedButton1()
  2. {
  3. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  4. int n = Puerto->ReadData(lectura, 49);
  5. if (n > 0)
  6. {
  7. lectura[n + 1] = '\0';
  8. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura);
  9. }
  10. }

Tiene comportamiento no deseado. Si uso ON, luego pulso OFF, me aparece el mensaje del ON, si vuelvo a pulsar OFF, me aparece el mensaje del OFF por fin, pero, debo pulsar dos veces el mismo botón para que me aparezca el mensaje adecuado. A parte de esto, si desde el puerto serie me aparece una entrada de texto sin yo solicitarlo desde el ordenador o PC, nunca me aparece el texto en pantalla.

La forma ideal es, desde que me llegue datos al puerto serie, desde que detecte algo, algún carácter, lo muestra en pantalla. Hay que buscar un evento o una función que cumpla esos requisitos.

Ahí no tengo idea, al menos he logrado que se muestre algo, porque desde hace meses no me comía una rosca, y desde los foros oficiales de Microsoft tanto en español como en Inglés, no tienen idea del tema de los puertos series y Arduino.

Sólo falta saber una buena función que detecte las entradas de datos en el Rich y asunto resuelto.

Saludos.


« Última modificación: 26 Julio 2017, 06:46 am por Meta » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #1 en: 26 Julio 2017, 01:25 am »

¿Cuál es el tipo exacto de IDC_EDIT_MENSAJE_DESDE_ARDUINO? ¿Es un puntero?


« Última modificación: 26 Julio 2017, 01:32 am por ivancea96 » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #2 en: 26 Julio 2017, 01:56 am »

Buenas:

IDC_EDIT_MENSAJE_DESDE_ARDUINO es el nombre del componente indicado en la foto.

Saludos.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #3 en: 26 Julio 2017, 02:04 am »

-.-'
El tipo exacto es lo que me interesa. VS te lo suele decir si pasas el cursor por encima, o puedes hacerle click derecho y darle a ver la declaración.
En fin, el tipo (int, int*, double...). Es importante saber si es un puntero o no.

También el tipo de "lectura", y ya de paso, el tipo del campo "text".
« Última modificación: 26 Julio 2017, 02:11 am por ivancea96 » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #4 en: 26 Julio 2017, 03:10 am »

Hola:

El código de arribano está bien, solo ontentaba hacer que lea la variable Lectura y lo muestre en el Rich en pantalla.

Intenté buscar la solución y llegué hasta aquí.
http://www.w3ii.com/es/mfc/mfc_rich_edit.html

Si fuera C# sería algo así:

Código
  1. Rich.txt = Lectura.toString();

Como no se como se hace en MFC, pido ayuda. ;)

El código muestra en pantalla lo que le llega del puerto serie. Es lo que tiene que hacer.

Saludos.


Edito:
Sin tener éxito y sabiendo que cada derrota es una experiencia, sigo por aquí.

Intenté hacer esto para buscar el .text y añadir la variable Lectura.

Código
  1. IDC_EDIT_MENSAJE_DESDE_ARDUINO.text = Lectura;

Y este otro:
Código:
IDC_EDIT_MENSAJE_DESDE_ARDUINO->text = Lectura;

No sirve. No funciona así. Me dio por hacer otra cosa como indico abajo. Lo que hago abajo, ni idea de lo que estoy haciendo, son locuras mias que si por pura suerte, espero con experanza de tener una luz que me diga una idea sobre los errores que cometo. Porque ne programación, jugar con la suerte, su éxito es extremadamente bajo.


Añado el nombre de la variable llamado prueba.


Al darle Finalizar, me crea esto en el código.
Código
  1. DDX_Control(pDX, IDC_EDIT_MENSAJE_DESDE_ARDUINO, prueba);

Concretamente aquí:
Código
  1. void CMFC_ArduinoDlg::DoDataExchange(CDataExchange* pDX)
  2. {
  3. CDialogEx::DoDataExchange(pDX);
  4. DDX_Control(pDX, IDC_EDIT_MENSAJE_DESDE_ARDUINO, prueba);
  5. }

Luego me dió por hacer lo mismo que antes pero sin éxito alguno.
Código
  1. prueba.text = Lectura;

No encuentro el santo text. A lo mejor se llama otra cosa, porque aquí en propiedades no ecuentro nada de nada para escribir.


Edito 3:

Hola de nuevo:

Si me deja escribir por aquí. Leyendo y leyendo por internet, hasta en ruso, encontré este enlace.

SetDlgItemText

En C# sería algo así cmo indiqué arriba, pero no lo es:
Código
  1. Rich.txt = Lectura.toString();

Se usa así:
Código
  1. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura); // Mostrar texto.

En parte me ha funcionado, solo en parte, es decir. Si pulso el botón ON o OFF, no pasa nada. Si escribo una letra en el Rich, aparece ya los textos desde el puerto serie. Vuelvo a pulsar el botón ON o el OFF, no pasa nada, si escribo otra letra en el Rich que se llama IDC_EDIT_MENSAJE_DESDE_ARDUINO, vuelve aparecer nuevos datos desde el puerto serie. Esto ocurre así porque he usado este evento que puedes ver aquí. No encuentro otro evento que valga la pena.

Código de este evento:
Código
  1. void CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino()
  2. {
  3. int n = Puerto->ReadData(lectura, 49);
  4. if (n > 0)
  5. {
  6. lectura[n + 1] = '\0';
  7. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura);
  8. }
  9. }

Si escribo una letra, en el Rich, me aparece por fin el mensaje, solo si escribe una letra, lo que sea con tal de detectar algo. Por lo que se ve, este método no es el adecuado.


Hice otro truco a ver si cuela, pero tampoco funciona como quiero. Puede el código en cada botón, el ON y OFF, usando el mismo código, y sin usar el void para reutilización de código, no quería perder el tiempo.
Código
  1. void CMFC_ArduinoDlg::OnBnClickedButton1()
  2. {
  3. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  4. int n = Puerto->ReadData(lectura, 49);
  5. if (n > 0)
  6. {
  7. lectura[n + 1] = '\0';
  8. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura);
  9. }
  10. }

Tiene comportamiento no deseado. Si uso ON, luego pulso OFF, me aparece el mensaje del ON, si vuelvo a pulsar OFF, me aparece el mensaje del OFF por fin, pero, debo pulsar dos veces el mismo botón para que me aparezca el mensaje adecuado. A parte de esto, si desde el puerto serie me aparece una entrada de texto sin yo solicitarlo desde el ordenador o PC, nunca me aparece el texto en pantalla.

La forma ideal es, desde que me llegue datos al puerto serie, desde que detecte algo, algún carácter, lo muestra en pantalla. Hay que buscar un evento o una función que cumpla esos requisitos.

Ahí no tengo idea, al menos he logrado que se muestre algo, porque desde hace meses no me comía una rosca, y desde los foros oficiales de Microsoft tanto en español como en Inglés, no tienen idea del tema de los puertos series y Arduino.

Sólo falta saber una buena función que detecte las entradas de datos en el Rich y asunto resuelto.

Saludos.
« Última modificación: 26 Julio 2017, 06:52 am por Meta » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #5 en: 26 Julio 2017, 22:35 pm »

Hola:

Intenté aquí entenderles pero no les entiendo.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/43471fe9-cc75-4af9-b1af-f3bf0bff26e6/i-want-to-use-a-correct-event?forum=vcgeneral

¿Alguna idea de lo que dicen?

Saludos.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #6 en: 26 Julio 2017, 23:07 pm »

Te dicen que utilices WaitCommEvent Para esperar un evento del puerto serie. El puerto serie tiene un HANDLE si lo abres con CreateFile. ¿Cómo estás abriendo el puerto serie?

En fin, que WaitCommEvent espera hasta que hay un evento. Aquí el cómo funciona: https://msdn.microsoft.com/en-us/library/aa363479(VS.85).aspx
En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #7 en: 27 Julio 2017, 05:40 am »

Hola:

De todo el formulario este es du código:
Código
  1. // MFC_ArduinoDlg.cpp: archivo de implementación
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "MFC_Arduino.h"
  6. #include "MFC_ArduinoDlg.h"
  7. #include "afxdialogex.h"
  8. #include "SerialClass.h"
  9. #include <iostream>
  10. #include <fstream>
  11. #include <Windows.h>
  12.  
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #endif
  16.  
  17.  
  18. // Cuadro de diálogo de CMFC_ArduinoDlg
  19.  
  20. // Puerto serie.
  21. Serial* Puerto = new Serial("COM4");
  22. // Comandos para Arduino.
  23. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie.
  24. char Luz_OFF[] = "Luz_OFF";
  25. char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
  26.  
  27. CMFC_ArduinoDlg::CMFC_ArduinoDlg(CWnd* pParent /*=NULL*/)
  28. : CDialogEx(IDD_MFC_ARDUINO_DIALOG, pParent)
  29. {
  30. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  31. }
  32.  
  33. void CMFC_ArduinoDlg::DoDataExchange(CDataExchange* pDX)
  34. {
  35. CDialogEx::DoDataExchange(pDX);
  36. }
  37.  
  38. BEGIN_MESSAGE_MAP(CMFC_ArduinoDlg, CDialogEx)
  39. ON_WM_PAINT()
  40. ON_WM_QUERYDRAGICON()
  41. ON_BN_CLICKED(IDC_BUTTON2, &CMFC_ArduinoDlg::OnBnClickedButton2)
  42. ON_BN_CLICKED(IDC_BUTTON1, &CMFC_ArduinoDlg::OnBnClickedButton1)
  43. ON_EN_UPDATE(IDC_EDIT_MENSAJE_DESDE_ARDUINO, &CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino)
  44. END_MESSAGE_MAP()
  45.  
  46.  
  47. // Controladores de mensaje de CMFC_ArduinoDlg
  48.  
  49. BOOL CMFC_ArduinoDlg::OnInitDialog()
  50. {
  51. CDialogEx::OnInitDialog();
  52.  
  53. // Establecer el icono para este cuadro de diálogo.  El marco de trabajo realiza esta operación
  54. //  automáticamente cuando la ventana principal de la aplicación no es un cuadro de diálogo
  55. SetIcon(m_hIcon, TRUE); // Establecer icono grande
  56. SetIcon(m_hIcon, FALSE); // Establecer icono pequeño
  57.  
  58. // TODO: agregar aquí inicialización adicional
  59.  
  60. return TRUE;  // Devuelve TRUE  a menos que establezca el foco en un control
  61. }
  62.  
  63. // Si agrega un botón Minimizar al cuadro de diálogo, necesitará el siguiente código
  64. //  para dibujar el icono.  Para aplicaciones MFC que utilicen el modelo de documentos y vistas,
  65. //  esta operación la realiza automáticamente el marco de trabajo.
  66.  
  67. void CMFC_ArduinoDlg::OnPaint()
  68. {
  69. if (IsIconic())
  70. {
  71. CPaintDC dc(this); // Contexto de dispositivo para dibujo
  72.  
  73. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  74.  
  75. // Centrar icono en el rectángulo de cliente
  76. int cxIcon = GetSystemMetrics(SM_CXICON);
  77. int cyIcon = GetSystemMetrics(SM_CYICON);
  78. CRect rect;
  79. GetClientRect(&rect);
  80. int x = (rect.Width() - cxIcon + 1) / 2;
  81. int y = (rect.Height() - cyIcon + 1) / 2;
  82.  
  83. // Dibujar el icono
  84. dc.DrawIcon(x, y, m_hIcon);
  85. }
  86. else
  87. {
  88. CDialogEx::OnPaint();
  89. }
  90. }
  91.  
  92. // El sistema llama a esta función para obtener el cursor que se muestra mientras el usuario arrastra
  93. //  la ventana minimizada.
  94. HCURSOR CMFC_ArduinoDlg::OnQueryDragIcon()
  95. {
  96. return static_cast<HCURSOR>(m_hIcon);
  97. }
  98.  
  99.  
  100.  
  101. void CMFC_ArduinoDlg::OnBnClickedButton2()
  102. {
  103. // Encender luz.
  104. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
  105. }
  106.  
  107.  
  108. void CMFC_ArduinoDlg::OnBnClickedButton1()
  109. {
  110. // Apagar Luz.
  111. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); // Envía al puerto el texto "Luz_OFF".
  112. }
  113.  
  114.  
  115.  
  116. /* // Este código qu eme dieron da error.
  117. HANDLE hCom;
  118. OVERLAPPED o;
  119. BOOL fSuccess;
  120. DWORD dwEvtMask;
  121.  
  122.  
  123. if (WaitCommEvent(hCom, &dwEvtMask, &o))
  124. {
  125. OnEnUpdateEditMensajeDesdeArduino();
  126. }
  127.  
  128.  
  129. */
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137. void CMFC_ArduinoDlg::OnEnUpdateEditMensajeDesdeArduino()
  138. {
  139. int n = Puerto->ReadData(lectura, 49);
  140. if (n > 0)
  141. {
  142. lectura[n + 1] = '\0';
  143. SetDlgItemText(IDC_EDIT_MENSAJE_DESDE_ARDUINO, lectura);
  144. }
  145. }

Los códigos son generados, mira a partir de la línea 101 que ahí es cuando empecé a codear. No entiendo la parte del CreateFile, ni papa, cero patatero y estoy pescando. Cazando moscas.

Uso la librería Seriaclass.
https://github.com/Gmatarrubia/LibreriasTutoriales

Espero resolver esto. Si que es complicado el tema del MFC C++, con razón que nadie lo puede ver, ajjajaj ajjaj ajajaj aa.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #8 en: 27 Julio 2017, 13:36 pm »

MFC no es complicado. Nada de este problema tiene que ver con MFC. Tu problema principal es el uso del Serial.

Acerca del handle... La librería que usas, deberías leerla. Dentro, tiene un HANDLE, llamado hSerial. Es un miembro privado. Basta que le hagas un getter o que le agregues una función para esperar datos.
Para trabajar con un puerto, se utiliza CreateFile. Si ves en la librería, está usando CreateFile.

El códigoq ue te dieron no lo puedes poner ahí, en un lugar al aar y pretender que funcione. Eso no funcionaría ni en C++, ni en C# ni en ningún lenguaje. ¿Cómo vas a poner un if fuera de una función?
Lo que tienes que hacer, es poner ese código en el lugar en el que quieras esperar datos del Arduino. Puedes hacerlo con otro thread, o dentro de un punto en el que sepas que va a recibir datos. Digo esto, porque si te pones a esperar indefinidamente, bloquearás la aplicación.

Dicho esto, te dirá. No tienes por qué bloquearte para escuchar del Arduino como te dijeron. Es una opción, pero no la única. Basta con que cada cierto tiempo mires si hay datos con el read y listo. Ya que estás leyendo datos a la vez que muestras el formulario, te recomendaría trabajar o con otro thread, o con la función SetTimer (https://msdn.microsoft.com/es-es/library/49313fdf(v=vs.80).aspx).
« Última modificación: 27 Julio 2017, 13:46 pm por ivancea96 » En línea

Meta


Desconectado Desconectado

Mensajes: 3.501



Ver Perfil WWW
Re: Elegir el evento exacto
« Respuesta #9 en: 27 Julio 2017, 19:24 pm »

Se lo que fuera. ¿Puedes hacer un ejemplo?

La verdad es que estoy en el aire.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿a qué se debe que el timer en winforms sea poco exacto?
.NET (C#, VB.NET, ASP)
Bengalaa 3 4,930 Último mensaje 22 Abril 2010, 18:40 pm
por Bengalaa
Saber el nombre exacto de la tarjeta de sonido con vb6.0
Programación Visual Basic
hunter18 0 1,562 Último mensaje 9 Septiembre 2010, 07:35 am
por hunter18
Hacer un Clon Exacto de un Sitio de Joomla??..
Desarrollo Web
ositocaro 3 4,048 Último mensaje 16 Febrero 2011, 07:44 am
por madpitbull_99
Ciclo exacto
Programación C/C++
neeeko 1 2,829 Último mensaje 22 Febrero 2013, 04:59 am
por 85
Saber Web oficial de Willem exacto
Electrónica
Meta 0 2,477 Último mensaje 14 Agosto 2014, 06:45 am
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines