Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#411
Sea como sea, que funcione de una vez, así me paso hacer en versión de Visual C++ MFC. Quiero tanto en consola como en formulario.

He estado buscando y que va.
https://sites.google.com/site/fernandoagomezf/programacion-en-c/tips-de-programador-c/win32-api/leer-y-escribir-datos-en-puertos-seriales

La otra historia que tengo, es como dije, también hacer el MFC C++ que también tengo mis dudas y creo que peores, porque nunca lo he hecho arrancar.

###################################################################################################
Siguiendo este tutorial desde la página 36 he creado el formulario MFC tal como indica ahí y tal como lo quiero.

Quiero enviar y recibir datos al puerto serie. Las librerías del puerto serie las puedes descargar aquí. He cargado las librerías dentro del proyecto y se muestra como indica en la imagen.


He Añadido dos botones al formulario y lo he llamado ON y el otro OFF como puedes ver en la imagen.


En Exploradores de Soluciones, abre el archivo llamado MFC_Arduino.cpp para ver el código fuente. Arriba, en la barra de herramientas o en los menús, pulsa, Proyecto --> Propiedades MFC_Arduino... y deja la opción tal como indica en la imagen de abajo.


Librerías agregadas en el Explorador de soluciones.


Dejando todo tal como está y las librerías cargada, intento ejecutar y compilar el programa vacío. Me produce un error que es este:
Citar
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  

Se que la librería está bien. Puede que las librerías o archivos cargados de forma predeterminada con Visual Studio C++ 2017 Win32 no sea el adecuado y hay que borrarlas, o hacer alguna modificación.
###################################################################################################

El MFC es otra historia que ya haré más adelante. Por cierto, a nadie le interesa los MFC ni Win32 de C++ hoy en día, exeptuando a los que se lo obligan hacer en universidades o por pura curiosidad como yo, JEjejejejejjejejeje.

A seguir con el modo consola de C++ aunque cueste, y mira que cuesta, sea como sea, que funcione. Y mira que pensé comprar la versión del libro pequeño de C++ del 2008 y este del 2014 actualizado.


http://anayamultimedia.es/libro.php?id=3607608

Como curiosidad.
¿Que lenguaje de programación debería saber para el 2017?

Si sabes hacer el programa, adelante, no me tengas 4 años en C++ que no lo domin. ;)

Saludos.
#412
En C# está hecho el programa por completo,funciona como debe ser y en C++ me da la tabarra.

Código (csharp) [Seleccionar]
using System;
using System.Text;
using System.IO.Ports;

namespace Envio_y_recepcion_puerto_serie_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            // Título de la ventana.
            Console.Title = "Recibir datos desde Arduino con C#";

            // Tamaño ventana consola.
            Console.WindowWidth = 55; // X. Ancho.
            Console.WindowHeight = 18; // Y. Alto.

            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
            SerialPort Puerto_serie = new SerialPort("COM4");

            Puerto_serie.BaudRate = 115200;
            Puerto_serie.Parity = Parity.None;
            Puerto_serie.StopBits = StopBits.One;
            Puerto_serie.DataBits = 8;
            Puerto_serie.Handshake = Handshake.None;
            Puerto_serie.RtsEnable = true;

            // Establecer los tiempos de espera de lectura / escritura.
            Puerto_serie.ReadTimeout = 500; // Milisegundos.
            Puerto_serie.WriteTimeout = 500;

            // Detecta cualquier dato recibido.
            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            Puerto_serie.Open(); // Abrir puerto.

            ConsoleKey tecla;
            Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");

            do
            {
                tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.

                switch (tecla)
                {
                    case ConsoleKey.D1: // Tecla 1 del teclado estandar.
                    case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
                        byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
                        Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
                        break;

                    case ConsoleKey.D2:
                    case ConsoleKey.NumPad2:
                        byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
                        Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
                        break;

                    default:
                        Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
                        break;
                }
            }

            // Pulsa Escape para salir del menú.
            while (tecla != ConsoleKey.Escape);

            Console.WriteLine("Presione cualquier tecla para terminar...");
            Console.WriteLine();
            Console.ReadKey(); // Espera pulsar una tecla cualquiera.
            Puerto_serie.Close(); // Cierra el puerto serie.
        }

    // Detecta cualquier dato entrante.
    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
            Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
        }
    }
}
#413
¿Qué esperas de ahí?
Código (cpp) [Seleccionar]
while ((tecla == 1) || (tecla == 2));

No se me ocurre nada.

Código (csharp) [Seleccionar]
            // Pulsa Escape para salir del menú.
            while (tecla != ConsoleKey.Escape);


Lo pondría igual que C#, pero  ya sabes, de C++ se muy más bien tirando a nada.
#414
Vaya, que fallo, no me he dado cuenta en todo el día con el while ahí.

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <stdio.h>
#include "SerialClass.h"
using namespace std;

void main()
{
// Título de la ventana
SetConsoleTitle("Control Led Arduino.");

// 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.
int tecla; // Guarda las teclas pulsadas.

Puerto->IsConnected(); // Puerto abierto.

cout << "Introduzca la opcion deseada: " << endl << endl;


do
{
cin >> tecla; // Aquí introduces un número, el 1 o el 2.

switch (tecla)
{

case 1:
// Encener luz.
cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
break;

case 2:
// Apagar luz.
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
break;

default: // Si haz pulsado otro número distinto del 1 y 2, muestra
cout << "Puse del 1 al 2."; // este mensaje.
}

} while (tecla != 0);

while (true)
{
int n = Puerto->ReadData(lectura, 49);
if (n > 0) {
lectura[n + 1] = '\0';
break;
}
Sleep(500); // Lo dejo en 500 ms por si acaso.
}
}


Dice enviado pero no se si envia algo en realidad, nunca responde.
#415
Hola:

Puedes hacer un hola mundo programando para 64 bits, si lo ejecutas en un micro de 32 bits, de entrada no funcionará.

Saludos.
#416
Hola:

Tener claro que en un sistema de 64 bits el System32 es de 64 bits y el wow64 es de 32 bits, lo hicieron así para que sean compatibles con muchos programas.

http://www.samlogic.net/articles-spanish/explicacion-carpetas-archivos-de-programa-x86-syswow64.htm

Saludos.
#417
Buenas:

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <stdio.h>
#include "SerialClass.h"
using namespace std;

void main()
{
// Título de la ventana
SetConsoleTitle("Control Led Arduino.");

// 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.
int tecla; // Guarda las teclas pulsadas.

cout << "Introduzca la opcion deseada: " << endl << endl;


do
{
cin >> tecla; // Aquí introduces un número, el 1 o el 2.

while (tecla)
{
case 1:
// Encener luz.
cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
break;

case 2:
// Apagar luz.
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
break;

default: // Si haz pulsado otro número distinto del 1 y 2, muestra
cout << "Puse del 1 al 2."; // este mensaje.
}

} while (tecla != 0);

while (true) {
int n = Puerto->ReadData(lectura, 49);
if (n > 0) {
lectura[n + 1] = '\0';
break;
}
Sleep(1);
}
}


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.
#418
Cita de: melonero en 24 Marzo 2017, 15:15 PM
odio windows

¿Qué es lo que odias de Windows?

Puede que aquí te de ideas.
https://underc0de.org/foro/asm/crear-y-escribir-un-archivo-en-asm/

Parece muy interesante tu programa. Porque la genreacion de ahora que soy yo lo hago con PIC en asm, el 8086 ya no lo toco.

Saludos.
#419
Lo más parecido que he hecho es esto.
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <stdio.h>
#include "SerialClass.h"
using namespace std;

void main()
{
// Título de la ventana
SetConsoleTitle("Control Led Arduino.");

// 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.
int tecla; // Guarda las teclas pulsadas.

cout << "Introduzca la opcion deseada: " << endl << endl;
cin >> tecla; // Aquí introduces un número, el 1 o el 2.

do
{
while (tecla)
{
case 1:
// Encener luz.
cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos.
Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON".
break;

case 2:
// Apagar luz.
cout << "Enviando: " << Luz_OFF << endl;
Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
break;

default: // Si haz pulsado otro número distinto del 1 y 2, muestra
cout << "Puse del 1 al 2."; // este mensaje.
}

} while (tecla != 0);
}

    while (true) {
    int n = Puerto->ReadData(lectura, 49);
    if (n > 0) {
    lectura[n + 1] = '\0';
    break;
    }
    Sleep(1);
    }
#420
Buenas:

Lo había probado, da este error:
Citarno 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:
[youtube=640,360]https://www.youtube.com/watch?v=MRiBUpgn-Z0[/youtube]



Saludos.