Autor
|
Tema: Intentar que me ejecute esta aplicación (Leído 2,944 veces)
|
Meta
|
Hola: Intento que me ejecute esta aplicación MFC de C++, lo que quiero hacer es abrir el puerto serie y intentar enviar datos. La ventana ya la tengo creado y esto si se ejecuta bien. El problema es cuando pincho en el botón ON para poner instrucciones y pasa cosas raras. A partir de la página 36 de este tutorial explica como se crea una ventana MFC. Supuestamente en C++ de consola, para activar el puerto es esta instrucción. Puerto->IsConnected()
Para enviar comandos es esta otra instrucciones. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON"
Para recibir datos, esta otra instracción. int n = Puerto->ReadData(lectura, 49); // Recibe datos del puerto serie.
Aún así, haga lo que haga, no me sale. Lo que tiene que hacer el programa es, desde que ejecutes el formulario, abra el puerto serie. Si pulso un botón, por ejemplo, el ON, envía el comando. ¿Alguna idea? Saludos.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Esa clase Serial se conecta al puerto en el constructor. IsConnected no hace nada, solo retorna un booleano, si está conectado o no. Se necesita más información, como el código de la función llamada en el evento click del botón. El problema es cuando pincho en el botón ON para poner instrucciones y pasa cosas raras. Nada es raro en programación. ¿Qué pasa exactamente?
|
|
|
En línea
|
|
|
|
Meta
|
Hola: Si lo ejecuto me aparece esto: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? Dentro del código coloqué esto: // Puerto serie. Serial* Puerto = new Serial("COM4"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto.
Entro del botón puse esto. Puerto->IsConnected(); // Encener luz. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
El código fuente completo del formulario MFC es este. // MFC_ArduinoDlg.cpp: archivo de implementación // #include "stdafx.h" #include "MFC_Arduino.h" #include "MFC_ArduinoDlg.h" #include "afxdialogex.h" #include "SerialClass.h" #include <iostream> #include <fstream> #include <Windows.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // Cuadro de diálogo de CMFC_ArduinoDlg // Puerto serie. Serial* Puerto = new Serial("COM4"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto. CMFC_ArduinoDlg::CMFC_ArduinoDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFC_ARDUINO_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFC_ArduinoDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFC_ArduinoDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, &CMFC_ArduinoDlg::OnBnClickedButton2) END_MESSAGE_MAP() // Controladores de mensaje de CMFC_ArduinoDlg BOOL CMFC_ArduinoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Establecer el icono para este cuadro de diálogo. El marco de trabajo realiza esta operación // automáticamente cuando la ventana principal de la aplicación no es un cuadro de diálogo SetIcon(m_hIcon, TRUE); // Establecer icono grande SetIcon(m_hIcon, FALSE); // Establecer icono pequeño // TODO: agregar aquí inicialización adicional return TRUE; // Devuelve TRUE a menos que establezca el foco en un control } // Si agrega un botón Minimizar al cuadro de diálogo, necesitará el siguiente código // para dibujar el icono. Para aplicaciones MFC que utilicen el modelo de documentos y vistas, // esta operación la realiza automáticamente el marco de trabajo. void CMFC_ArduinoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Contexto de dispositivo para dibujo SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Centrar icono en el rectángulo de cliente int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Dibujar el icono dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // El sistema llama a esta función para obtener el cursor que se muestra mientras el usuario arrastra // la ventana minimizada. HCURSOR CMFC_ArduinoDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFC_ArduinoDlg::OnBnClickedButton2() { // TODO: Agregue aquí su código de controlador de notificación de control. Puerto->IsConnected(); // Encener luz. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". }
Así que mucho he preguntado a universitarios en la calle, me dicen que si, que saben programar C++, le comento lo de MFC y no dicen ni mu, Jajajajajja. Se que es muy complicado el MFC.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
En primer lugar, lo que dije. IsConnected no hace nada. Puerto->IsConnected(); // Encener luz. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
Lo que tendrías que poner es un if(IsConnected()) antes de escribir datos. Si no está conectado, mostrar un mensaje de error al usuario o deshabilitar botones del formulario, lo que sea. Luego: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? ¿Te dice ese error sin más o te marca el error en un archivo en concreto? Y otro detalle: Serial* Puerto = new Serial("COM4");
Serial* puerto;, deberías tenerlo como un campo de la clase CMFC_ArduinoDlg, inicializarlo en el constructor y liberarlo en el destructor. Ten en cuenta que actualmente no liberas la memoria nunca (podrías, de hecho, quitarle el puntero y dejarlo como Serial puerto("COM4");. Y otra cosa: Si lo ejecuto me aparece esto: ¿Si lo ejecutas o si lo compilas? Antes dices que "pasan cosas raras al pulsar el botón", pero ese es un problema de compilación. ¿Es un warning o un error? Si es un error, no deberías podelro ejecutar (salvo que le des a ejecutar la última versión compilada; en tal caso, pues eso hará)
|
|
|
En línea
|
|
|
|
Meta
|
Hola: Más bien intenta compilar. 1>------ Operación Compilar iniciada: proyecto: MFC_Arduino, configuración: Debug Win32 ------ 1>SerialClass.cpp 1>c:\users\usuario\documents\visual studio 2017\projects\mfc_arduino\mfc_arduino\serialclass.cpp(140): fatal error C1010: final de archivo inesperado al buscar la directiva de encabezado precompilado. Compruebe si olvidó agregar '#include "stdafx.h"' al código fuente? 1>Compilación del proyecto "MFC_Arduino.vcxproj" terminada -- ERROR. ========== Compilar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ========== Lo tenía en Inglés, ya lo puse en español, dice lo mismo pero lo pongo por si acaso. Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error C1010 final de archivo inesperado al buscar la directiva de encabezado precompilado. Compruebe si olvidó agregar '#include "stdafx.h"' al código fuente? MFC_Arduino c:\users\usuario\documents\visual studio 2017\projects\mfc_arduino\mfc_arduino\serialclass.cpp 140
Desde que quite el archivo SerrialClass.cpp, si me compila y ejecuta el programa base, pero como es normal, no hace nada. Haciend pruebas sin poner ahora ni variables ni nada, solo con quitar el serialClass.cpp y ponerlo ahí es cuando sabes que algo no anda bien y te nombra el stdafx.h como si ese fuera el problema. Edito:Abrí el archivo SerialClass.cpp y puse el encabezado #include "stdafx.h". Le di compilar y me salió por fin y por primera vez esta ventana que tanto esperaba. Me dije a mi mismo que porfiiiiiiiiiiiinnnnnnnnnnnnn. Al pulsar el botón sea ON o OFF, ninguno funciona, no transmite nada al puerto serie. ¿Por qué? Código completo del archivo principal llamado MFC_ArduinoDlg.cpp: // MFC_ArduinoDlg.cpp: archivo de implementación // #include "stdafx.h" #include "MFC_Arduino.h" #include "MFC_ArduinoDlg.h" #include "afxdialogex.h" #include "SerialClass.h" #include <iostream> #include <fstream> #include <Windows.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // Cuadro de diálogo de CMFC_ArduinoDlg // Puerto serie. Serial* Puerto = new Serial("COM1"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto. CMFC_ArduinoDlg::CMFC_ArduinoDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFC_ARDUINO_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFC_ArduinoDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFC_ArduinoDlg, CDialogEx) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON2, &CMFC_ArduinoDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON1, &CMFC_ArduinoDlg::OnBnClickedButton1) END_MESSAGE_MAP() // Controladores de mensaje de CMFC_ArduinoDlg BOOL CMFC_ArduinoDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Establecer el icono para este cuadro de diálogo. El marco de trabajo realiza esta operación // automáticamente cuando la ventana principal de la aplicación no es un cuadro de diálogo SetIcon(m_hIcon, TRUE); // Establecer icono grande SetIcon(m_hIcon, FALSE); // Establecer icono pequeño // TODO: agregar aquí inicialización adicional return TRUE; // Devuelve TRUE a menos que establezca el foco en un control } // Si agrega un botón Minimizar al cuadro de diálogo, necesitará el siguiente código // para dibujar el icono. Para aplicaciones MFC que utilicen el modelo de documentos y vistas, // esta operación la realiza automáticamente el marco de trabajo. void CMFC_ArduinoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Contexto de dispositivo para dibujo SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Centrar icono en el rectángulo de cliente int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Dibujar el icono dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // El sistema llama a esta función para obtener el cursor que se muestra mientras el usuario arrastra // la ventana minimizada. HCURSOR CMFC_ArduinoDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFC_ArduinoDlg::OnBnClickedButton2() { // TODO: Agregue aquí su código de controlador de notificación de control. // Encener luz. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". } void CMFC_ArduinoDlg::OnBnClickedButton1() { // TODO: Agregue aquí su código de controlador de notificación de control. Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); }
Saludos.
|
|
« Última modificación: 2 Abril 2017, 11:31 am por Meta »
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Coprueba si el puerto está correctamente conectado con IsConnected, ya sea en los botones, en el constructor..., donde sea.
|
|
|
En línea
|
|
|
|
Meta
|
Hola: No se como hacer el truco que dices del: Puerto->IsConnected();
He hecho pruebas y por fin ya puedo enviar datos al puerto serie, el problema era que en vez del poner peurto COM4 dejé el COM1, ajjajajaja. Ahora me toca recibir mensajes pra enterarse que ha pasado. He incorporado un RichtEdit al formulario. Fijándome en el código de aquí para recibir datos. http://foro.elhacker.net/programacion_cc/puerto_serie_c_mejorar_el_programa-t466602.0.html;msg2115369#msg2115369Concretamente este: int n = Puerto->ReadData(lectura, 49); if (n > 0) { lectura[n + 1] = '\0'; cout << "Recibido: " << lectura << endl; cout << "-------------------" << endl; }
No se me ocurre como implementarlo.
|
|
|
En línea
|
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
evitar q una aplicacion se ejecute mas de 1 vez
Programación Visual Basic
|
Mr.Chispa
|
6
|
2,640
|
2 Noviembre 2006, 04:15 am
por Mr.Chispa
|
|
|
Como puedo crear una aplicacion que se ejecute sin la pantalla del form
« 1 2 3 »
Programación Visual Basic
|
xhc
|
29
|
11,939
|
8 Febrero 2008, 19:25 pm
por Sin Nick xD
|
|
|
¿Como crear aplicación que ejecute comandos en consola Windows 7?
Programación General
|
motocros_elche
|
1
|
3,886
|
20 Junio 2013, 06:27 am
por Eleкtro
|
|
|
Al intentar sacar el codigo fuente de una aplicacion me sale esto ¿que es?
Programación General
|
dega1980
|
1
|
2,658
|
3 Abril 2014, 15:35 pm
por Eleкtro
|
|
|
Así van a intentar robar tu Apple ID esta Navidad
Noticias
|
wolfbcn
|
0
|
1,311
|
11 Diciembre 2016, 02:34 am
por wolfbcn
|
|