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ú

Temas - Meta

#1
C# - VB.NET / E-mail y filtrado
Enero 09, 2022, 01:29:03 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Buenas:

En modo consola puedo enviar correo electrónico, cuyo código fuente lo dejo abajo para que lo vean. Solo puede enviar mensajes o e-mail, funciona muy bien.

Ahora quiero hacer otro programa, que solo lee email también en modo consola y  los e-mail que tanga filtrado, si tengo tres e-mail filtrados, pues solo acepta esos e-mail en pantalla. Todo esto, lee un mensaje por cada 5 minutos. Mensaje, Asunto y la dirección del e-mail.

¿Cómo se hace?

Aquí abajo dejo el codigo de enviar e-mail por consola que funciona al 100 %, con tildes, ñ y otros símbolos correctamente a parte de enviar más de 255 caracteres.

Para que funcione y se usa gmail.

// Activar / desactivar Acceso de aplicaciones poco seguras en Google.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código C#:
Código: php
using System;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Text;

namespace Enviar_email_Consola_07
{
    internal class Program
    {
        static void Main(string[] args)
        {
           

            // Variables.
            string usuario, contraseña, destinatario, asunto, mensaje;
            const int MAXIMA_LONGITUD = 40000;

            #region Configuración ventana.
            // Título de la ventana.
            Console.Title = "Gestor correo electrónico";

            // Tamaño de la ventana, x, y, o ancho y alto.
            const byte ancho = 80;
            const byte alto = 25;
            Console.SetWindowSize(ancho, alto);

            // Color de fondo.
            Console.BackgroundColor = ConsoleColor.Black;

            // Color de las letras.
            Console.ForegroundColor = ConsoleColor.Gray;

            // Limpiar pantalla y dejarlo todo en color de fondo.
            Console.Clear();

            // Visible el cursor.
            Console.CursorVisible = true;
            #endregion

            // Título del programa.
            Console.WriteLine("\t\t----------------------------------------");
            Console.WriteLine("\t\t\tEnviar Correo Electrónico");
            Console.WriteLine("\t\t----------------------------------------");

            try
            {
               
                Console.WriteLine("\n");
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("\t\tTu correo electrónico: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                usuario = Console.ReadLine();
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("\t\tIntroducir contraseña: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                contraseña = LeerPassword();
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("\t\tDestinatario: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                destinatario = Console.ReadLine();
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("\t\tAsunto: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                asunto = Console.ReadLine();
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("\t\tMensaje: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                //mensaje = Console.ReadLine();

                #region Enviar más de 255 caracteres.
                // #########################################################################
                Stream inputStream = Console.OpenStandardInput();
                byte[] buffer = new byte[MAXIMA_LONGITUD];
                int numerosBytesLeidos = inputStream.Read(buffer, 0, MAXIMA_LONGITUD);
                char[] chars = Console.InputEncoding.GetChars(buffer, 0, numerosBytesLeidos);
                mensaje = new string(chars);
                // #########################################################################
                #endregion

                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.Write("\t\tCantidad de texto introducido: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine(mensaje.Length);

                MailMessage correo = new MailMessage(usuario, destinatario, asunto, mensaje)
                {
                    // Enviar textos con tildes.
                    BodyEncoding = Encoding.UTF8
                };

                SmtpClient servidor = new SmtpClient("smtp.gmail.com")
                {
                    Port = 587
                };
                NetworkCredential credenciales = new NetworkCredential(usuario, contraseña);
                servidor.Credentials = credenciales;
                servidor.EnableSsl = true;

                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("\t\tEnviando correo...");
                servidor.Send(correo);
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("\t\tCorreo enviado satisfactoriamente.");
                correo.Dispose();
                Console.CursorVisible = false;
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("ERROR: \n");
                Console.WriteLine("\t\t" + ex.Message);
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("\t\tNo se ha enviado el correo.");
                Console.ReadKey();
            }

        }

        // A la hora de introducir la contraseña, se sustituye por asterístos (*) en pantalla.
        public static string LeerPassword()
        {
            ConsoleKeyInfo cki;
            StringBuilder sb = new StringBuilder();
            int contador = 0;

            do
            {
                cki = Console.ReadKey(true);
                if (cki.Key != ConsoleKey.Enter)
                {

                    sb.Append(cki.KeyChar);
                    if (contador < 1)
                    {
                        Console.Write("*");
                    }
                    contador++;
                }

                else
                {
                    break;
                }

            } while (true);
            Console.WriteLine();
            return sb.ToString();
        }
    }
}


Feliz año 2.022. ;)
#2
Buenas:

Me está dando resultados diferentes de un terminal que el propio mio en hexadecimal y no se el motivo. Cuando los datos recibidos son los mismos.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Quiero saber el motivo. Muchas gracias.

Configuración puerto serie.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Código C#:
Código: php
using System;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Terminal_UPS_SAI_02
{
    public partial class Form1 : Form
    {
        // Utilizaremos un string como buffer de recepción.
        string recibidos;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();

                // Añade puertos disponibles físicos  y virtuales.
                serialPort1.PortName = comboBox_Puerto.Text.ToString();

                // Añadir en la variable recibidos datos codificados.
                recibidos += serialPort1.Encoding = Encoding.GetEncoding(437);

                // Añadir datos recibidos en el evento.
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            }

            catch
            {
                MessageBox.Show("No encuentra ningún puerto físico ni virtual.", "Aviso:",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
        protected override void WndProc(ref Message USB)
        {
            if (USB.Msg == 0x219)
            {
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
            }

            // Detecta si hay cambios en el usb y si los hay los refleja.
            base.WndProc(ref USB);
        }

        private void button_Conectar_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente.
                serialPort1.BaudRate = Convert.ToInt32(comboBox_Baudios.Text); // Baudios.
                serialPort1.Open(); // Abrir puerto.
                comboBox_Puerto.Enabled = false;
                comboBox_Baudios.Enabled = false;
                button_Conectar.Enabled = false;
                button_Desconectar.Enabled = true;
                groupBox_Control_Zumbador.Enabled = true;
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message, "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void button_Desconectar_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close(); // Cerrar puerto.
                comboBox_Puerto.Enabled = true;
                comboBox_Baudios.Enabled = true;
                button_Conectar.Enabled = true;
                button_Desconectar.Enabled = false;
                groupBox_Control_Zumbador.Enabled = false;
            }

            catch (Exception error)
            {
                MessageBox.Show(error.Message, "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // Al cerrar el formulario, cierra el puerto si está abierto.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                serialPort1.Close(); // Cerrar puerto.
            }

            catch (Exception error)
            {
                MessageBox.Show(error.Message, "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // Al recibir datos.
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Acumula los caracteres recibidos a nuestro 'buffer' (string).
            recibidos += serialPort1.ReadExisting();

            // Invocar o llamar al proceso de tramas.
            Invoke(new EventHandler(Actualizar));
        }

        // Procesar los datos recibidos en el bufer y extraer tramas completas.
        private void Actualizar(object sender, EventArgs e)
        {

            // Asignar el valor de la trama al richTextBox.
            richTextBox1.Text += recibidos;

            // Pasar a hexadecimal.
            foreach (byte b in recibidos)
            {
                // x = minúscula, X = mayúscula.
                richTextBox1.Text += b.ToString("X2");
            }

            // Nueva línea.
            richTextBox1.Text += Environment.NewLine;

            // Pasar a binario.
            foreach (string leer in recibidos.Select(c => Convert.ToString(c, 2)))

            {
                richTextBox1.Text += leer.ToString();
            }

            // Nueva línea.
            richTextBox1.Text += Environment.NewLine;
            richTextBox1.Text += Environment.NewLine;

            // Selecciona la posición final para leer los mensajes entrantes.
            richTextBox1.SelectionStart = richTextBox1.Text.Length;

            // Mantiene el scroll en la entrada de cada mensaje.
            richTextBox1.ScrollToCaret();

            // Limpiar.
            recibidos = "";
        }

        private void button_Activar_Click(object sender, EventArgs e)
        {
            //byte[] mBuffer = Encoding.ASCII.GetBytes("K60:1\r"); // Comando K60:1 activar.
            byte[] mBuffer = Encoding.ASCII.GetBytes("X87\r"); // Comando X87 Flags.
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_Desactivar_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = Encoding.ASCII.GetBytes("K60:0\r"); // Comando K60:0 desactivar.
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_Mute_temporal_Click(object sender, EventArgs e)
        {
            byte[] mBuffer = Encoding.ASCII.GetBytes("K60:2\r"); // Comando K60:2 Mute temporal.
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void button_Limpiar_Click(object sender, EventArgs e)
        {
            // Limpiar.
            richTextBox1.Clear();
        }
    }
}


¿Alguna idea?

Saludos camaradas. ;)
#3
Hola:

Quiero crear en modo consola dos programas.

Programa 1, hace como si fuera el hyper Terminal de Windows, que usa el puerto serie.Introduzco por ejemplo, el valor 4 + 2, pulse Enter, lo envía por el puerto serie esos datos al Programa 2.

Programa 2, recibe datos del puerto serie por parte del Programa 1 y devuelve los datos calculados como en este caso, 4 + 2 = 6.

Ejemplo de como hacerlo.

Tengo dos programas abiertos en cada ordenador o PC en el cual se comunica por el puerto serie, tienen el protocolo 9600 y el Programa 1 tiene el COM1 y el Programa 2 tiene el COM2.

1) Teniendo los dos programas arrancados o ejecutados, el Programa 1 me pide que introduzca algún valor o fórmula matemática sencilla como este. Envío 1 + 4 y luego pulso Enter.

2) Esa información 1 + 4 es enviado al puerto serie desde el Programa 1 y le llega al Programa 2, en el cual detecta un valor matemático que en este caso es 1 + 4, lo calcula y devuelve este resultado 1 + 4 = 5 al Programa 1.

3) El Programa 1 recibe los datos y muestra en pantalla esto: 1 + 4 = 5.

Los dos programas, por supuesto, usan el mismo protocolo.
Código: php
         // 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.

¿Es posible hacerlo?

Saludos.
#4
Dudas y pedidos generales / CheckBox modo consola
Julio 08, 2020, 07:34:43 PM
Buenas:

En la consola de C#, quiero crear un menú que solo aparezca checkBox como indica abajo.


En este programa solo se usa las teclas de las flechas y la tecla Enter.

Como se puede ver, con la > indica en que opciones estás. Si pulsas arriba todo el rato, por ejemlo si estás en la [ ] Opción A, vuelves a pulsar arriba, directamente el > estrá por debajo, ocurre lo mismo pero al revés.

Como ejemplo, elejo la [ ] Opción B, pulse Enter y se pone una X en medio, como que está seleccionado.

Quedaría así:
> [X] Opción B.

Como indica en la captura de arriba.

En realidad quiero poner siete opciones en total, desde la A hasta la G.

En la primera parte de la pantalla quedaría algo así.

Código: php
 [ ] Opción A
  [X] Opción B
[ ] Opción C
> [X] Opción D

Si sigo pulsando la tecla hacia abajo, cambia otra página de menús, en realidad es el mismo. Quedaría como indica abajo.
Código: php
>  [X] Opción E
[ ] Opción F
[ ] Opción G
  Salir


Si pulsas salir, vuelves al menú principal. Por supuesto, todo dato guardado que en su variable, cada opción en su variable, y de paso, cada variable que en realidad es boleano, queda guardado en un Archivo.txt. Guarda datos de una opción desde que pulse Enter, sea  marcando la X o no. Todo queda guardado. A parte de todo esto, al ejecutar la aplicación, lee todos los datos que estaba almacenado en Archivo.txt.

Lo he intentado pero no doy para más, dejo el código de ejemplo aquí abajo.
Código: csharp
using System;

namespace CheckBox_consola_01_cs
{
    class Program
    {
        #region Variables.
        private static readonly string[] TEXTO = new string[] {
            "[ ] Opción A        ",
            "[X] Opción B        ",
            "[ ] Opción C        ",
            "SALIR"
        };
        #endregion

        static void Main(string[] args)
        {
            // Título de la ventana:
            Console.Title = "Título";

            // Tamaño de la ventana.
            Console.SetWindowSize(20, 5);

            // Fondo verde.
            Console.BackgroundColor = ConsoleColor.Blue;

            // Letras negras.
            Console.ForegroundColor = ConsoleColor.White;

            // Oculto el cursor.
            Console.CursorVisible = false;

            // Almacena la tecla pulsada en la variable.
            ConsoleKey teclaInicial;

            do
            {
                // Limpiar pantalla.
                Console.Clear();

                // Posición del cursor del título del MENÚ PRINCIPAL.
                Console.SetCursorPosition(0, 0);

                // Título.
                Console.Write("   MENÚ PRINCIPAL   ");

                // Pocisión de la hora.
                Console.SetCursorPosition(4, 2);

                // Formato numérico dd/MM/yyyy.
                Console.Write(DateTime.Now.ToString("ddd dd MMM"));

                // Almacena en la variable una tecla pulsada.
                teclaInicial = Console.ReadKey(true).Key;

                // ¿Haz pulsado la tecla Enter?
                if (teclaInicial == ConsoleKey.Enter)
                {
                    // Sí. Se ejecuta esta función.
                    MenuPrincipal();
                }
            } while (teclaInicial != ConsoleKey.Escape);

            #region Menú Principal.
            void MenuPrincipal()
            {

                // Contador de teclas y navegador.
                int opcion = 0;
                bool salir = false;
                // Capturar tecla para luego validar.
                ConsoleKey tecla;

                do
                {
                    //******************************************************************
                    // Dibujo el menú principal.

                    // Rellenar fondo verde.
                    //Console.BackgroundColor = ConsoleColor.Green;

                    // Letras negras.
                    //Console.ForegroundColor = ConsoleColor.Black;

                    // Limpiar pantalla.
                    Console.Clear();

                    switch (opcion)
                    {
                        case 0:
                            Console.SetCursorPosition(2, 0);
                            Console.Write(TEXTO[0]); // ( ) Opción A.
                            Console.SetCursorPosition(2, 1);
                            Console.Write(TEXTO[1]); // ( ) Opción B.
                            Console.SetCursorPosition(2, 2);
                            Console.Write(TEXTO[2]); // ( ) Opción C.
                            Console.SetCursorPosition(2, 3);
                            Console.Write(TEXTO[3]); // Salir.
                            Console.SetCursorPosition(0, 0);
                            Console.Write(">");
                            break;
                        case 1:
                            Console.SetCursorPosition(2, 0);
                            Console.Write(TEXTO[0]); // ( ) Opción A.
                            Console.SetCursorPosition(2, 1);
                            Console.Write(TEXTO[1]); // ( ) Opción B.
                            Console.SetCursorPosition(2, 2);
                            Console.Write(TEXTO[2]); // ( ) Opción C.
                            Console.SetCursorPosition(2, 3);
                            Console.Write(TEXTO[3]); // Salir.
                            Console.SetCursorPosition(0, 1);
                            Console.Write(">");
                            break;
                        case 2:
                            Console.SetCursorPosition(2, 0);
                            Console.Write(TEXTO[0]); // ( ) Opción A.
                            Console.SetCursorPosition(2, 1);
                            Console.Write(TEXTO[1]); // ( ) Opción B.
                            Console.SetCursorPosition(2, 2);
                            Console.Write(TEXTO[2]); // ( ) Opción C.
                            Console.SetCursorPosition(2, 3);
                            Console.Write(TEXTO[3]); // Salir.
                            Console.SetCursorPosition(0, 2);
                            Console.Write(">");
                            break;
                        case 3:
                            Console.SetCursorPosition(2, 0);
                            Console.Write(TEXTO[0]); // ( ) Opción A.
                            Console.SetCursorPosition(2, 1);
                            Console.Write(TEXTO[1]); // ( ) Opción B.
                            Console.SetCursorPosition(2, 2);
                            Console.Write(TEXTO[2]); // ( ) Opción C.
                            Console.SetCursorPosition(2, 3);
                            Console.Write(TEXTO[3]); // Salir.
                            Console.SetCursorPosition(0, 3);
                            Console.Write(">");
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }

                    // Fin de pintar el menú principal.
                    //******************************************************************

                    // Leer tecla ingresada por el usuario.
                    tecla = Console.ReadKey(true).Key;

                    // Validar el tipo de tecla.
                    if (tecla == ConsoleKey.Enter)
                    {
                        switch (opcion)
                        {
                            case 0:
                                //OpcionA();
                                break;
                            case 1:
                                //OpcionB();
                                break;
                            case 2:
                                //OpcionC();
                                break;
                            case 3:
                                salir = true;
                                break;
                            default:
                                break;
                        }
                    }

                    if (tecla == ConsoleKey.DownArrow)
                    {
                        opcion++;
                    }

                    if (tecla == ConsoleKey.UpArrow)
                    {
                        opcion--;
                    }

                    // Si está en la última opción, salta a la primera.
                    if (opcion > 3)
                    {
                        opcion = 0;
                    }

                    // Si está en la primera posición, salta a la última.
                    if (opcion < 0)
                    {
                        opcion = 3;
                    }
                    // Uso la tecla escape como salida.
                } while (salir == false);
            }
            #endregion
        }
    }
}

El código está incomleto y mal diseñado, seguro que se hace en menos código.

Gracias.
#5
Dudas y pedidos generales / Adaptar este script a C#
Julio 08, 2020, 05:50:16 PM
Buenas:

Este código hecho Python abajo, quiero adaptarlo a C#, sea en consola Windows Form o WPF, que haga la misma función.

Código: python
    import os, sys, tkFileDialog,Tkinter
         
    root = Tkinter.Tk()
    root.withdraw()
         
    formats = [ ('Roms Super Nintendo SMC','.smc'),('Roms Super Nintendo SFC','.sfc'),('Fichier Bin','.bin'),('Roms Super Nintendo','.smc .sfc .bin') ]
         
    input = tkFileDialog.askopenfile(parent=root,mode='rb',filetypes=formats,
                                     title='Seleccione el archivo para intercambiar bin HI a LO como A16->A15, A17->A16...A21->A20 y A15->21')
    if not input:
        print "Error: no se puede abrir el archivo."
        sys.exit()
         
    output = tkFileDialog.asksaveasfile(parent=root,mode='wb',filetypes=formats,title='Crear nombre de archivo de salida.')
    if not output:
        print "Error: no se puede crear el archivo de salida."
        sys.exit()
         
         
        # Leer el archivo de entrada a una matriz de bytes.
        data = bytearray(input.read())
         
        # Calculando el tamaño de la habitación en 2 exponentes.
        expsize = 0
        bytesize = len(data)
        while bytesize > 1:
                expsize += 1
                bytesize = bytesize // 2
         
        # Iniciar una matriz de bytes vacía de tamaño adecuado.
        buffer = bytearray()
        for i in range(2**expsize): buffer.append(0)
         
        # Hagamos el intercambio.
        count = 0   
        for i in range(len(data)):
                addr = (i & 0x7fff) + ((i & 0x008000) << (expsize - 16)) + ((i & 0x010000) >> 1) + ((i & 0x020000) >> 1) + ((i & 0x040000) >> 1)
                + ((i & 0x080000) >> 1) +   ((i & 0x100000) >> 1) + ((i & 0x200000) >> 1)
                if addr != i: count += 1
                buffer[addr] = data[i]
        print "Intercambiadas %s (%s) direcciones" % (count, hex(count))
         
        # Escribir archivo de salida.
        output.write(buffer)
         
        # Cerrar archivos maneja.
        input.close()
        output.close()


Gracias.
#6
Hola:

Antes que nada.

¿Con Visual studio 2019 Community 2019 se puede usar PowerShell?

A lo que iba.

Quiero adaptar este código de Python 2.7 a PowerShell.

¿Es posible?

Código: python
import os, sys, tkFileDialog,Tkinter
     
root = Tkinter.Tk()
root.withdraw()
     
formats = [ ('Roms Super Nintendo SMC','.smc'),('Roms Super Nintendo SFC','.sfc'),('Fichier Bin','.bin'),('Roms Super Nintendo','.smc .sfc .bin') ]
     
input = tkFileDialog.askopenfile(parent=root,mode='rb',filetypes=formats,
                                 title='Seleccione el archivo para intercambiar bin HI a LO como A16->A15, A17->A16...A21->A20 y A15->21')
if not input:
    print "Error: no se puede abrir el archivo."
    sys.exit()
     
output = tkFileDialog.asksaveasfile(parent=root,mode='wb',filetypes=formats,title='Crear nombre de archivo de salida.')
if not output:
    print "Error: no se puede crear el archivo de salida."
    sys.exit()
     
     
    # Leer el archivo de entrada a una matriz de bytes.
    data = bytearray(input.read())
     
    # Calculando el tamaño de la habitación en 2 exponentes.
    expsize = 0
    bytesize = len(data)
    while bytesize > 1:
            expsize += 1
            bytesize = bytesize // 2
     
    # Iniciar una matriz de bytes vacía de tamaño adecuado.
    buffer = bytearray()
    for i in range(2**expsize): buffer.append(0)
     
    # Hagamos el intercambio.
    count = 0
    for i in range(len(data)):
            addr = (i & 0x7fff) + ((i & 0x008000) << (expsize - 16)) + ((i & 0x010000) >> 1) + ((i & 0x020000) >> 1) + ((i & 0x040000) >> 1)
            + ((i & 0x080000) >> 1) + ((i & 0x100000) >> 1) + ((i & 0x200000) >> 1)
            if addr != i: count += 1
            buffer[addr] = data[i]
    print "Intercambiadas %s (%s) direcciones" % (count, hex(count))
     
    # Escribir archivo de salida.
    output.write(buffer)
     
    # Cerrar archivos maneja.
    input.close()
    output.close()


Gracias.
#7
Hola:

Este código funciona a medias. Más bien, no logro situarlo. Está escrito en consola C#.

Lo que hace el programa:

Se usa solo las teclas flechas del teclado y la tecla Enter.

El programa empieza así;


Como puedes ver arriba, puedes escribir con las flechas arriba y abajo letras para poner un nombre. Por ejemplo, voy a poner Hola amigo. Lo puedes ver en la captura de abajo.



Pulsa Enter.
Se muestra el > al lado de ATRÁS. Tal como muestra abajo.


Lo que debe hace en esta parte indicado en la imagen de arriba es:
1. Si toco las flechas del teclado izquierda y derecha, me señala con > Atrás o en GUARDAR.
2. Si pulso las flecha arriba o abajo, puedes volver a editar la palabra "Hola amigo", puedes corregir o escribir otra cosa.
3. Si pulsas Enter donde estabas escribiendo "Hola amigo", vuelves en ATRÁS con el >.
4. Estando en > ATRÁS, si pulsas Enter, muestra un mensaje tal como muestra en la captura de abajo y el programa se acaba ahí.



El problema que no me funciona esta parte y la que voy a indicar ahora tampoco me funciona.
Si estoy en > ATRÁS, al pulsas las flechas derecha o izquierda, debo estar ya en > GUARDAR.

Precisamente no me sale.

A parte de esto, si pulsas Enter cuando estés en > GUARDAR. Se queda guardado el texto "Hola amigo" guardado en una variable que en este caso se llama static string guardarNombre = "";

Se tiene que mostrar la imagen de abajo.


Y se acaba el programa.

Me perdí. Alguna idea como se programa esto.

Código C#:
Código: php
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LCD_nombre_archivo_consola_08
{
    class Program
    {
        static string guardarNombre = "";
        static int coordenadaX = 0;
        private static ConsoleKey tecla;

        // Caracteres de este array.
        static readonly char[] roALFANUMERICO = new char[]
        {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
            'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
            'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
            'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','.', ',', '-', '_', ':', ';',
            '¿', '?', '(', ')', '[', ']', '{', '}','=', '$','&', '"', ' '
        };

        // Dirección del carácter del array. El 80 presenta al espacio del array roALFANUMERICO.
        static readonly int[] roINDICE_ARRAY = new int[]
        {
            80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
        };

        private static readonly string[] roTEXTO = new string[] { "ATRÁS", "GUARDAR" };

        static int index = 0;
        static void Main(string[] args)
        {
            // Título de la pantalla.
            Console.Title = "Cambiar nombre";

            Inicio();
        }

        #region Inico.
        private static void Inicio()
        {
            // Tamaño de la ventana.
            Console.SetWindowSize(20, 5); // X

            // Fondo verde, azul, gris.
            Console.BackgroundColor = ConsoleColor.Gray;

            // Letras negras, blanco, negro.
            Console.ForegroundColor = ConsoleColor.Black;

            // Limpiar pantalla.
            Console.Clear();

            Console.SetCursorPosition(0, 0);
            Console.Write("Nombre del relé 1:  ");
            Console.SetCursorPosition(0, 1);
            //Console.Write("AAAAAAAAAAAAAAAA");

            // Recorre todo el índice del array y el de los datos alfanumérico
            // y los rellena.
            for (int i = 0; i < roINDICE_ARRAY.Length; i++)
            {
                Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
            }

            Console.SetCursorPosition(2, 3);
            Console.Write(roTEXTO[0]); // ATRÁS.
            Console.SetCursorPosition(12, 3);
            Console.Write(roTEXTO[1]); // GUARDAR.

            while (true)
            {
                Console.SetCursorPosition(coordenadaX, 1);

                // Almacena cualquier tecla pulsada en la variable key.
                tecla = Console.ReadKey(true).Key;
                switch (tecla)
                {
                    case ConsoleKey.RightArrow:
                        if (coordenadaX < 15)
                        {
                            coordenadaX++;
                        }
                        break;

                    case ConsoleKey.LeftArrow:
                        if (coordenadaX > 0)
                        {
                            coordenadaX--;
                        }
                        break;

                    case ConsoleKey.UpArrow:
                        roINDICE_ARRAY[coordenadaX]++;
                        if (roINDICE_ARRAY[coordenadaX] >= roALFANUMERICO.Length)
                        {
                            roINDICE_ARRAY[coordenadaX] = 0;
                        }
                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
                        break;

                    case ConsoleKey.DownArrow:
                        roINDICE_ARRAY[coordenadaX]--;
                        if (roINDICE_ARRAY[coordenadaX] < 0)
                        {
                            roINDICE_ARRAY[coordenadaX] = roALFANUMERICO.Length - 1;
                        }
                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
                        break;

                    case ConsoleKey.Enter:
                        Console.SetCursorPosition(1, 3);
                        Console.CursorVisible = false;
                        Console.Write(">");

                        while (true)
                        {
                            tecla = Console.ReadKey(true).Key;

                            switch (tecla)
                            {
                                case ConsoleKey.RightArrow:
                                case ConsoleKey.LeftArrow:
                                    index = 1 - index;
                                    break;

                                case ConsoleKey.UpArrow:
                                case ConsoleKey.DownArrow:
                                    Console.SetCursorPosition(coordenadaX, 1);
                                    break;

                                case ConsoleKey.Enter:
                                   
                                    break;
                            }

                            for (int a = 0; a < 2; a++)
                            {
                                Console.SetCursorPosition(1 + (10 * a), 3);
                                if (a == index)
                                {
                                    Console.Write(">");
                                }
                                else
                                {
                                    Console.Write(" ");
                                }
                            }

                            if (index == 0)  // se pulsó Atrás
                            {
                                Atras();
                                //break;  // vuelve a la edición de letras
                            }

                            if (index == 1)  // se pulsó Guardar
                            {
                                Guardar();
                            }
                        }
                }
            }
        }
        #endregion

        private static void Atras()
        {
            Console.Clear();
            Console.SetCursorPosition(0, 1);
            Console.Write("HAS PULSADO ATRÁS   ");
            Console.ReadKey(); // Pulse cualquier tecla para salir.
        }

        private static void Guardar()
        {
            Console.Clear();
            Console.SetCursorPosition(0, 1);
            Console.Write("HAS GUARDADO       ");
            for (int a = 0; a < roINDICE_ARRAY.Length; a++)
            {
                guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
            }
            Console.SetCursorPosition(0, 2);
            Console.Write(guardarNombre);
        }
    }
}


Gracias.
#8
Hola:

Trabajando en modo consola C# 2019.

Quiero hacer un programa de ejemplo sobre creación de menús y submenús como se hacía en la época de antes, solo usando la consola de C#, nada de WindowsForm ni WPF.

Los código que hago son muy extensos, muy repetitivos pero fáciles de actualizar si quiere añadir nuevos submenús o funciones.

¿Me pueden dar alguna idea o consejos a la hora de hacer menús y menús?

Lo que he hecho hasta ahora es horrible pero funciona.

Me da que hay que hacer estructura de diseño antes, de hacer programación directa.


Ver vídeo.


Código: php
using System;

namespace Menu_consola_18_cs
{
    class Program
    {
        // Variable general para guardar el > de la última opción que haz entrado
        // en la hora de volver atrás. Por ejemplo:
        private static int guardarOpcion = 0;
        static void Main(string[] args)
        {
            Console.Title = "Menú de opciones";

            // Tamaño ventana consola.
            // X anchura.
            Console.WindowWidth = 20;

            // Y altura.
            Console.WindowHeight = 5;

            // Ocultar cursor.
            Console.CursorVisible = false;

            // Fondo verde.
            Console.BackgroundColor = ConsoleColor.Green;

            // Letras negras.
            Console.ForegroundColor = ConsoleColor.Black;

            MenuPrincipal();
        }

        #region Menú principal.
        public static void MenuPrincipal()
        {
            // Almacena la tecla pulsada en la variable.
            ConsoleKey teclaInicial;

            // Limpiar pantalla.
            Console.Clear();

            // Posición del cursor del título del MENÚ PRINCIPAL.
            Console.SetCursorPosition(0, 0);

            // Título.
            Console.Write("   MENÚ PRINCIPAL   ");

            // Pocisión de la hora.
            Console.SetCursorPosition(4, 2);

            // Formato numérico dd/MM/yyyy.
            Console.Write(DateTime.Now.ToString("ddd dd MMM"));

            // Almacena en la variable una tecla pulsada.
            teclaInicial = Console.ReadKey(true).Key;

            // ¿Haz pulsado la tecla Enter?
            if (teclaInicial == ConsoleKey.Enter)
            {
                // Sí. Se ejecuta esta función.
                MenuOpciones();
            }
        }
        #endregion

        #region Menú de opciones principales.
        public static void MenuOpciones()
        {
            // Contador de teclas y navegador.
            int opcion = 0;
            opcion = guardarOpcion;

            // Capturar tecla para luego validar.
            ConsoleKey tecla;

            while (true)
            {
                //******************************************************************
                // Dibujo el menú principal.

                // Limpiar pantalla.
                Console.Clear();

                switch (opcion)
                {
                    case 0:
                        Console.SetCursorPosition(0, 0);
                        Console.Write("> Opción A.         ");
                        Console.SetCursorPosition(0, 1);
                        Console.Write("  Opción B.         ");
                        Console.SetCursorPosition(0, 2);
                        Console.Write("  Opción C.         ");
                        Console.SetCursorPosition(0, 3);
                        Console.Write("  Salir.            ");
                        break;
                    case 1:
                        Console.SetCursorPosition(0, 0);
                        Console.Write("  Opción A.         ");
                        Console.SetCursorPosition(0, 1);
                        Console.Write("> Opción B.         ");
                        Console.SetCursorPosition(0, 2);
                        Console.Write("  Opción C.         ");
                        Console.SetCursorPosition(0, 3);
                        Console.Write("  Salir.            ");
                        break;
                    case 2:
                        Console.SetCursorPosition(0, 0);
                        Console.Write("  Opción A.         ");
                        Console.SetCursorPosition(0, 1);
                        Console.Write("  Opción B.         ");
                        Console.SetCursorPosition(0, 2);
                        Console.Write("> Opción C.         ");
                        Console.SetCursorPosition(0, 3);
                        Console.Write("  Salir.            ");
                        break;
                    case 3:
                        Console.SetCursorPosition(0, 0);
                        Console.Write("  Opción A.         ");
                        Console.SetCursorPosition(0, 1);
                        Console.Write("  Opción B.         ");
                        Console.SetCursorPosition(0, 2);
                        Console.Write("  Opción C.         ");
                        Console.SetCursorPosition(0, 3);
                        Console.Write("> Salir.            ");
                        break;
                    default:
                        Console.Write("Fuera de rango.     ");
                        break;
                }

                // Fin de pintar el menú principal.
                //******************************************************************

                // Leer tecla ingresada por el usuario.
                tecla = Console.ReadKey(true).Key;

                // Validar el tipo de tecla.
                if (tecla == ConsoleKey.Enter)
                {
                    switch (opcion)
                    {
                        case 0:
                            OpcionA();
                            break;
                        case 1:
                            OpcionB();
                            break;
                        case 2:
                            OpcionC();
                            break;
                        case 3:
                            guardarOpcion = 0;
                            MenuPrincipal();
                            break;
                        default:
                            break;
                    }
                }

                // Flecha abajo del teclado.
                if (tecla == ConsoleKey.DownArrow)
                {
                    opcion++;
                }

                // Flecha arriba del teclado.
                if (tecla == ConsoleKey.UpArrow)
                {
                    opcion--;
                }

                // Si está en la última opción del menú, salta a la primera.
                if (opcion > 3)
                {
                    opcion = 0;
                }

                // Si está en la primera posición del menú, salta a la última.
                if (opcion < 0)
                {
                    opcion = 3;
                }
            }
        }
        #endregion

        #region Opción A (0).
        public static void OpcionA()
        {
            ConsoleKey teclaOpcionA;
            Console.Clear();
            do
            {
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Estás en Opción A.");
                Console.SetCursorPosition(0, 2);
                Console.WriteLine("Pulse Enter para");
                Console.SetCursorPosition(0, 3);
                Console.WriteLine("Salir.");

                // Almacena el teclado pulsado en la variable teclaSubMenuA.
                teclaOpcionA = Console.ReadKey(true).Key;

            } while (teclaOpcionA != ConsoleKey.Enter);
        }
        #endregion

        #region Opción B (1).
        public static void OpcionB()
        {
            // Contador de teclas y navegador.
            int opcionB = 0;

            // Capturar tecla para luego validar.
            ConsoleKey teclaOpcionB;

            while (true)
            {
                switch (opcionB)
                {
                    case 0:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción B.  ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("> SubOpción B-1.    ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  SubOpción B-2     ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Salir.            ");
                        break;
                    case 1:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción B.  ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  SubOpción B-1.    ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("> SubOpción B-2     ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Salir.            ");
                        break;
                    case 2:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción B.  ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  SubOpción B-1.    ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  SubOpción B-2     ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("> Salir.            ");
                        break;
                    default:
                        Console.Write("Fuera de rango.     ");
                        break;
                }

                // Leer tecla ingresada por el usuario.
                teclaOpcionB = Console.ReadKey(true).Key;

                // Validar el tipo de tecla.
                if (teclaOpcionB == ConsoleKey.Enter)
                {
                    switch (opcionB)
                    {
                        case 0:
                            OpcionB1();
                            break;
                        case 1:
                            OpcionB2();
                            break;
                        case 2:
                            guardarOpcion = 1;
                            MenuOpciones();
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
                }

                if (teclaOpcionB == ConsoleKey.DownArrow)
                {
                    opcionB++;
                }

                if (teclaOpcionB == ConsoleKey.UpArrow)
                {
                    opcionB--;
                }

                // Si está en la última opción, salta a la primera.
                if (opcionB > 2)
                {
                    opcionB = 0;
                }

                // Si está en la primera posición, salta a la última.
                if (opcionB < 0)
                {
                    opcionB = 2;
                }
            }
        }

        #endregion

        #region Opcion B-1.
        public static void OpcionB1()
        {
            ConsoleKey teclaOpcionB1;
            Console.Clear();
            do
            {
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Estás en Opción B-1.");
                Console.SetCursorPosition(0, 2);
                Console.WriteLine("Pulse Enter para    ");
                Console.SetCursorPosition(0, 3);
                Console.WriteLine("volver atrás.       ");

                // Almacena el teclado pulsado en la variable teclaSubMenuA.
                teclaOpcionB1 = Console.ReadKey(true).Key;

            } while (teclaOpcionB1 != ConsoleKey.Enter);
        }
        #endregion

        #region Opcion B-2.
        public static void OpcionB2()
        {
            ConsoleKey teclaOpcionB2;
            Console.Clear();
            do
            {
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Estás en Opción B-2.");
                Console.SetCursorPosition(0, 2);
                Console.WriteLine("Pulse Enter para    ");
                Console.SetCursorPosition(0, 3);
                Console.WriteLine("volver atrás.       ");

                // Almacena el teclado pulsado en la variable teclaSubMenuA.
                teclaOpcionB2 = Console.ReadKey(true).Key;

            } while (teclaOpcionB2 != ConsoleKey.Enter);
        }
        #endregion

        #region Opción C (2).
        public static void OpcionC()
        {
            // Contador de teclas y navegador.
            int opcionC = 0;

            // Capturar tecla para luego validar.
            ConsoleKey teclaOpcionC;
            Console.Clear();
           
            while(true)
            {
                switch (opcionC)
                {
                    case 0:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción C.  ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("> Color 1.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  Color 2.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Opción C-1.       ");
                        break;
                    case 1:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción C.  ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  Color 1.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("> Color 2.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Opción C-1.       ");
                        break;
                    case 2:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción C.  ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  Color 1.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  Color 2.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("> Opción C-1.       ");
                        break;
                    case 3:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("> Color 3.          ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  Color 4.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  Color 5.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Salir.            ");
                        break;
                    case 4:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("  Color 3.          ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("> Color 4.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  Color 5.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Salir.            ");
                        break;
                    case 5:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("  Color 3.          ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  Color 4.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("> Color 5.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("  Salir.            ");
                        break;
                    case 6:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("  Color 3.          ");
                        Console.SetCursorPosition(0, 1);
                        Console.WriteLine("  Color 4.          ");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  Color 5.          ");
                        Console.SetCursorPosition(0, 3);
                        Console.WriteLine("> Salir.            ");
                        break;

                    default:
                        Console.Write("Fuera de rango.     ");
                        break;
                }

                // Leer tecla ingresada por el usuario.
                teclaOpcionC = Console.ReadKey(true).Key;

                // Validar el tipo de tecla.
                if (teclaOpcionC == ConsoleKey.Enter)
                {
                    switch (opcionC)
                    {
                        case 0:
                            // Fondo azul.
                            Console.BackgroundColor = ConsoleColor.Blue;

                            // Letras blancas.
                            Console.ForegroundColor = ConsoleColor.White;
                            break;
                        case 1:
                            // Fondo verde.
                            Console.BackgroundColor = ConsoleColor.Green;

                            // Letras negras.
                            Console.ForegroundColor = ConsoleColor.Black;
                            break;
                        case 2:
                            OpcionC1();
                            break;
                        case 3:
                            // Fondo negro.
                            Console.BackgroundColor = ConsoleColor.Black;

                            // Letras rojo.
                            Console.ForegroundColor = ConsoleColor.Red;
                            break;
                        case 4:
                            // Fondo negro.
                            Console.BackgroundColor = ConsoleColor.Black;

                            // Letras rojo.
                            Console.ForegroundColor = ConsoleColor.Yellow;
                            break;
                        case 5:
                            // Fondo negro.
                            Console.BackgroundColor = ConsoleColor.Red;

                            // Letras rojo.
                            Console.ForegroundColor = ConsoleColor.DarkRed;
                            break;
                        case 6:
                            guardarOpcion = 2;
                            MenuOpciones();
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
                }

                if (teclaOpcionC == ConsoleKey.DownArrow)
                {
                    opcionC++;
                }

                if (teclaOpcionC == ConsoleKey.UpArrow)
                {
                    opcionC--;
                }

                // Si está en la última opción, salta a la primera.
                if (opcionC > 6)
                {
                    opcionC = 0;
                }

                // Si está en la primera posición, salta a la última.
                if (opcionC < 0)
                {
                    opcionC = 6;
                }
            }
        }
        #endregion

        #region OpcionC-1.
        public static void OpcionC1()
        {
            // Contador de teclas y navegador.
            int opcionC1 = 0;

            // Capturar tecla para luego validar.
            ConsoleKey teclaOpcionC1;
            Console.Clear();
           
            while(true)
            {
                Console.Clear();

                switch (opcionC1)
                {
                    case 0:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción C-1.");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("  SI");
                        Console.SetCursorPosition(16, 2);
                        Console.WriteLine("> NO");
                        break;
                    case 1:
                        Console.SetCursorPosition(0, 0);
                        Console.WriteLine("Estás en Opción C-1.");
                        Console.SetCursorPosition(0, 2);
                        Console.WriteLine("> SI");
                        Console.SetCursorPosition(16, 2);
                        Console.WriteLine("  NO");
                        break;
                    default:
                        Console.Write("Fuera de rango.     ");
                        break;
                }

                // Leer tecla ingresada por el usuario.
                teclaOpcionC1 = Console.ReadKey(true).Key;

                // Validar el tipo de tecla.
                if (teclaOpcionC1 == ConsoleKey.Enter)
                {
                    switch (opcionC1)
                    {
                        case 0:
                            guardarOpcion = 2;
                            MenuPrincipal();
                            //Console.Clear();
                            break;
                        case 1:
                            OpcionSI();
                            break;
                        default:
                            Console.Write("Fuera de rango.     ");
                            break;
                    }
                }

                // Flecha derecha.
                if (teclaOpcionC1 == ConsoleKey.RightArrow)
                {
                    opcionC1++;
                }

                // Flecha izquierda.
                if (teclaOpcionC1 == ConsoleKey.LeftArrow)
                {
                    opcionC1--;
                }

                // Si está en la última opción, salta a la primera.
                if (opcionC1 > 1)
                {
                    opcionC1 = 0;
                }

                // Si está en la primera posición, salta a la última.
                if (opcionC1 < 0)
                {
                    opcionC1 = 1;
                }
            }
        }
        #endregion

        #region opcionSI del sub menú C-1.
        public static void OpcionSI()
        {
            ConsoleKey teclaOpcionB1;
            Console.Clear();
            do
            {
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Estás en Opción SÍ.");
                Console.SetCursorPosition(0, 2);
                Console.WriteLine("Pulse Enter para    ");
                Console.SetCursorPosition(0, 3);
                Console.WriteLine("volver atrás.       ");

                // Almacena el teclado pulsado en la variable teclaOpciónB1.
                teclaOpcionB1 = Console.ReadKey(true).Key;

            } while (teclaOpcionB1 != ConsoleKey.Enter);
        }
        #endregion
    }
}


Saludos.
#9
Buenas:

En la consola C# me aparece el asunto a la hora de leer el último email del, pero no aparece el mensaje. Quiero que me aparezca en pantalla tanto el asunto y el mensaje.

No se su código del pop3 para leer mensajes, si me envian un mensaje nuevo y luego ejecuto el programa, me apecere así sin mensaje porque no se como programarlo.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Código C#:
Código: php
using System;
using System.Collections.Generic;
using OpenPop.Pop3;

namespace Recibir_email_Consola_01
{
    class Program
    {
        static void Main(string[] args)
        {
            // Título de la ventana.
            Console.Title = "Recibir e-mail con Consola C#";

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

            // Cursor invisible.
            Console.CursorVisible = false;

            // Título del programa.
            Console.WriteLine("\t\t----------------------------------------");
            Console.WriteLine("\t\t\tRecibir Correo Electrónico");
            Console.WriteLine("\t\t----------------------------------------");

            try
            {
                ConnectPop3 oC = new ConnectPop3();

                List<OpenPop.Mime.Message> lstMessages = oC.GetMessages();


                if (lstMessages != null)
                {

                    foreach (var oMessage in lstMessages)
                    {
                        Console.WriteLine("ASUNTO:  " + oMessage.Headers.Subject + "\n"); // Asunto.
                                                //Console.WriteLine();
                        Console.WriteLine("MENSAJE: "); // Aquí se pone código del mensaje que no se cual es.
                    }
                }
                Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
                Console.WriteLine();
                Console.WriteLine("FIN DEL PROGRAMA.");
                Console.ReadKey(); // Pulse cualquier tecla para salir.
            }

            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }

    public class ConnectPop3
    {
        public string email = "[email protected]";
        public string contraseña = "g0923490xgh0945g450Xj4025g"; // Ficticio.
        public int puerto = 995;
        public bool usarSLL = true;
        public string Hostame = "pop.gmail.com";

        public List<OpenPop.Mime.Message> GetMessages()
        {
            using (Pop3Client oClient = new Pop3Client())
            {
                oClient.Connect(Hostame, puerto, usarSLL);
                oClient.Authenticate(email, contraseña);

                int messageCount = oClient.GetMessageCount();
                List<OpenPop.Mime.Message> lstMessages = new List<OpenPop.Mime.Message>(messageCount);

                for (int i = messageCount; i > 0; i--)
                {
                    lstMessages.Add(oClient.GetMessage(i));
                }

                return lstMessages;
            }
        }
    }
}


Lo que si le logrado es poner email, fecha y algunos más datos, precisamente el que más quiero que es el mensaje no se como hacerlo o como buscarlo.

¿Alguna idea?

Saludos.
#10
Hola:

Usando el modo consola de C# 2017. Hice un mini menú de opciones gracias a los compañeros de este foro. Puedo seleccionar con los botones arriba y abajo las opciones.

Se usa formato de la pantalla 16x2.

En este caso lo que hace es seleccionar opciones en el menú, pero no hace nada más. Las opciones en el menú se llama.

Menú ▲▼

1. UNO
2. DOS
3. TRES
4. CUATRO
5. ESC - SALIR

Por ejemplo, seleccionamos el 3. TRES. Pulse Enter y justo una línea de abajo dice:

3. TRES ▲▼

Después de pulsar Enter, se sustituye el texto 3. TRES ▲▼ por otro abajo.

Alum. ●●●●●●○○

En el cual podemos hacer cosas, estando ya en la subopción indicado arriba. Si pulsamos Enter, de Alum. ●●●●●●○○ vuelve al menú principal en este caso donde estaba, llamdo 3. TRES ▲▼. Si etás todavía en Alum. ●●●●●●○○, puedes pulsar la teclas arriba y abajo para mover las opciones indicadas de esta manera mostrada abajo.

Son 8 puntos. Lo que hace es alumbrar el brillo de una luz, el brillo más débil es de esta manera. Alum. ○○○○○○○○. El brillo máximo es de otra manera, Alum. ●●●●●●●●. Con las flechas del teclado arriba y abajo, seleccionamos un punto, de 1 hasta 8. La mitad sería así: Alum. ●●●●○○○○. Pulsa enter, guarda la configuración en una variable para que la recuerde y sale al menú principal.

Espero que se entienda lo que quiero hacer.

Dejo el código base, solo selecciona opciones pero al pulsar Enter tiene que hacer al menos el 3. TRES.

Código consola C#:
Código: php
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Menu_consola_09_cs
{
    class Program
    {
        static void Main(string[] args)
        {
            // Título de la ventana.
            Console.Title = "Menú de opciones";

            // Tamaño ventana consola.
            // X anchura.
            Console.WindowWidth = 16;

            // Y altura.
            Console.WindowHeight = 2;

            // Oculto el cursor.
            Console.CursorVisible = false;

            // Contador de teclas y navegador.
            int contador = 0;

            // Capturar tecla para luego validar.
            ConsoleKey tecla;

            do
            {

                //******************************************************************
                // Dibujo el menú.
               
                // Rellenar fondo verde.
                Console.BackgroundColor = ConsoleColor.Green;

                // Letras negras.
                Console.ForegroundColor = ConsoleColor.Black;
               
                // Limpiar pantalla.
                Console.Clear();

                if (contador == 0)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.Write("MENú ▲▼");
                }

                if (contador == 1)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("1.   UNO");
                }

                if (contador == 2)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("2.   DOS");
                }

                if (contador == 3)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("3.   TRES");
                }

                if (contador == 4)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("4.  CUATRO");
                }

                if (contador == 5)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine("5. ESC = SALIR");
                }

                // Fin de pintar el menú.
                //******************************************************************

                // Leer tecla ingresada por el usuario.
                tecla = Console.ReadKey(true).Key;

                //validar el tipo de tecla
                if (tecla == ConsoleKey.DownArrow)
                {
                    contador += 1;
                }

                if (tecla == ConsoleKey.UpArrow)
                {
                    contador -= 1;
                }

                // Si está en la última opción, salta a la primera.
                if (contador > 5)
                {
                    contador = 0;
                }

                // Si está en la primera posición, salta a la última.
                if (contador < 0)
                {
                    contador = 5;
                }

                // Uso la tecla escape como salida.
            } while (tecla != ConsoleKey.Escape);
        }
    }
}


Captura:


Una cosa a tener en cuenta. En vez de aparecer

MENú ▲▼

En pantalla, lo primero que debe aparecer en el programa en HOLA. Si pulsas Enter, entonces ya aparece el Menú. Si pulsa salir apareces en HOLA. Luego hacer lo demás con el 3. TRES indicado arriba.

¿Alguna ayuda?

Saludos.
#11
Hola:

Antes que nada, si no puedes ver las capturas, actualiza el navegador.

He creado un formulario con Windows Form (Win32). Quiero añadir en él dos botones. Por ahora he hecho esto.

Paso 1:


Paso 2:


Pado 3:


Se me genera códigos pero no se ve el formulario. Lo que demuestra se un engorro programar así hoy en día, pero hay empresas que si programan así y enseñan en algunas universidades les gusten a los alumnos o no.

Paso 4:


Aquí lo dejo el formulario como si fuese por defeto 300x300 pero en realidad es muy grande para mi gusto.

Quiero hacer dos cosas. Poner el tamaño del formulario a 300 x 300 y introducir 2 botones. Quiero hacer.

Un botón se llama: Abrir y el otro Cerrar.

Encontré dos enlaces para hacer un botón.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

¿Cómo se hace?

No tengo ni la grandísima idea de hacerlo, ya que al compilar, a pesar de no haber errores, ni redimensiona o pone el tamaño que quiero al formulario, ni hay ni un solo botón en dicho formumalario.

El trozo de código a incluir es este.
Código: php
   hInst = hInstance; // Almacenar identificador de instancia en una variable global

   HWND hWnd = CreateWindowW(
   szWindowClass,
   szTitle,
   WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
   0,
   CW_USEDEFAULT,
   0,
   nullptr,
   nullptr,
   hInstance,
   nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE; // me estas vacilando o algo asi?

   // ######################################################################
   hInst = hInstance; // Almacenar identificador de instancia en una variable global

   HWND hWnd2 = CreateWindowW(
   szWindowClass,
   szTitle,
   WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT,
   0,
   CW_USEDEFAULT,
   0,
   nullptr,
   nullptr,
   hInstance,
   nullptr);

   if (!hWnd2)
   {
   return FALSE;
   }

   ShowWindow(hWnd2, nCmdShow);
   UpdateWindow(hWnd2);
   // AQUI POR EJEMPLO!!! posición(100,100), tamaño(600,400)
   SetWindowPos(hWnd2, 0, 100, 100, 600, 400, NULL);

   return TRUE;
   // ######################################################################


Código completo es este pero no funciona a pesar de compilar bien.
Código: php
#include "stdafx.h"
#include "aaaa.h"

#define MAX_LOADSTRING 100

// Variables globales:
HINSTANCE hInst;                                // Instancia actual
WCHAR szTitle[MAX_LOADSTRING];                  // Texto de la barra de título
WCHAR szWindowClass[MAX_LOADSTRING];            // nombre de clase de la ventana principal

// Declaraciones de funciones adelantadas incluidas en este módulo de código:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: colocar código aquí.

    // Inicializar cadenas globales
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_AAAA, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // Realizar la inicialización de la aplicación:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AAAA));

    MSG msg;

    // Bucle principal de mensajes:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return (int) msg.wParam;
}



//
//  FUNCIÓN: MyRegisterClass()
//
//  PROPÓSITO: registrar la clase de ventana.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_AAAA));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_AAAA);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   FUNCIÓN: InitInstance(HINSTANCE, int)
//
//   PROPÓSITO: guardar el identificador de instancia y crear la ventana principal
//
//   COMENTARIOS:
//
//        En esta función, se guarda el identificador de instancia en una variable común y
//        se crea y muestra la ventana principal del programa.
//


   // ######################################################################
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{ // de verdad esto es serio?
hInst = hInstance; // Almacenar identificador de instancia en una variable global

HWND hWnd = CreateWindowW(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
nullptr,
nullptr,
hInstance,
nullptr);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE; // me estas vacilando o algo asi?

// ######################################################################
hInst = hInstance; // Almacenar identificador de instancia en una variable global

HWND hWnd2 = CreateWindowW(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
nullptr,
nullptr,
hInstance,
nullptr);

if (!hWnd2)
{
return FALSE;
}

ShowWindow(hWnd2, nCmdShow);
UpdateWindow(hWnd2);
// AQUI POR EJEMPLO!!! posición(100,100), tamaño(600,400)
SetWindowPos(hWnd2, 0, 50, 50, 100, 100, NULL);

return TRUE;
// ######################################################################
}
   // ######################################################################


//
//  FUNCIÓN: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PROPÓSITO:  procesar mensajes de la ventana principal.
//
//  WM_COMMAND  - procesar el menú de aplicaciones
//  WM_PAINT    - Pintar la ventana principal
//  WM_DESTROY  - publicar un mensaje de salida y volver
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Analizar las selecciones de menú:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: Agregar cualquier código de dibujo que use hDC aquí...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// Controlador de mensajes del cuadro Acerca de.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}



Saludos.

PD: La verdad, no sabía que fuera tan coñazo, pesado, complicado en hacer lo que estoy pidiendo.
#12
Hola:

Hice un programa en la consola con C# sobre una broma. Por ahora es muy sencillo, falta pulirlo mucho y añadir lo que quiero hacer. Este ejecutable es para gasta una mini broma a los amigos, no abusar que desconfían hasta futuros amigos sin conocerte, jajajajajja.

Lo que he hecho hasta ahora para que se hagan una idea y funciona:
Está hecho en modo consola con el lenguaje C#.
Al ejecutar el ejecutable, nunca muestra la pantalla negra.
Crea un archivo de texto llamado Hola.txt.
Guarda dicho archivo en el escritorio, en este caso para hacer pruebas, pero en realidad el que quiera lo guarda en Startup, cada vez que inicia Windows, aparece el Holatxt abierto, pero esto más adelante.
En el archivo dice: Hola amigo.
Se guarda valores en el editor de registro, que cada cierto vez ejecutada, hay un contador. Tengo otro programa hecho pero con txt plano y en formato para guardar valores.
Abre la bandeja de disco si tiene alguno.

Lo que me falta por hacer y no tengo idea es:
Con el tiempo o veces que haz pulsado el ejecutable, se invierte 180º el escritorio, se pone al revéz.
Que cambie el ratón a zurdo.
Que busque si tiene impresora, imprima esta frase. Hola amigo. Solo te he gastado un folio.
Salga el simulador de pantalla de la muerte de Windwos con el tiempo de 2 segundos, luego dice: "Es una bromaaaaaa" y se quite.

Así por cada 3 inicios de Windows le ocurre algo nuevo indicado arriba.

Al final, que se borre el ejecutable, la idea es bromear, no dejar rastros ni tampoco fastidiar al amigo borrando cosas.

El código es muy básico pero se los dejo aquí. Poco a poco quiero aumentar funciones.

Código C#:
Código: php
using Microsoft.Win32;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace Broma_Comsola_04
{
    class Program
    {
        // Importar dll.
        [DllImport("winmm.dll")]
        public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
        int uReturnLength, IntPtr hwndCallback);

        public static StringBuilder rt = new StringBuilder(127);

        static void Main(string[] args)
        {
            // Root.
            const string userRoot = "HKEY_CURRENT_USER";
            // Clave.
            const string subkey = "Aaaaaaa";
            // FullName.
            const string keyName = userRoot + "\\" + subkey;
            // ValueName.
            const string valueName = "Contador";

            // Variables txt.
            string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            // Si no existe la Key, dará -1.
            int contador = Convert.ToInt32(Registry.GetValue(keyName, valueName, -1) ?? -1);

            // Comprueba si la key, al ser -1 si la key no existe.
            if (contador >= 0)
            {
                // Si el contador es mayor que 0.
                if (contador > 0)
                {
                    // Sobre escribe la key con -1 su valor.
                    Registry.SetValue(keyName, valueName, contador -= 1);
                }

                // Si el contador es igual a 0.
                if (contador == 0)
                {
                    // Escribe un nuevo arhivo de texto con su contenido correspondiente.
                    File.WriteAllText(Path.Combine(path, "Hola.txt"), "Hola amigo.");
                }

                if (contador == 1)
                {
                    // Abrir bandeja del lector.
                    mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
                }

            }
            // Entonces.
            else
            {
                // Escribe en el registro el valor.
                Registry.SetValue(keyName, valueName, 3);
            }
        }
    }
}


¿Alguna ayuda?

Saludos.
#13
Dudas y pedidos generales / Adaptar C++ CLR a C++ Win32
Noviembre 16, 2017, 12:16:47 AM
Hola:

Quiero adaptar este código de C++ CLR a C++ Win32. Antes que nada, quiero saber si es posible o hay que complicarse mucho la vida para hacer lo mismo. El código lo que hace es abrir y cerrar la bandeja de cualquier lector de discos sea IDE o SATA.

Código C++ CLR:
Código: php
#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Text;

[DllImport("winmm.dll")]
extern Int32 mciSendString(String^ lpstrCommand, StringBuilder^ lpstrReturnString,
int uReturnLength, IntPtr hwndCallback);

static void DoEvents()
{
Console::SetCursorPosition(0, 6);
Console::Write("Abriendo...");
}

static void DoEvents2()
{
Console::SetCursorPosition(0, 6);
Console::Write("Cerrando...");
}

int main(array<System::String ^> ^args)
{
StringBuilder^ rt = gcnew StringBuilder(127);

// Título de la ventana.
Console::Title = "Control lector de bandeja. C++ CLR";

// Tamaño ventana consola.
Console::WindowWidth = 29; // X. Ancho.
Console::WindowHeight = 8; // Y. Alto.

  // Cursor invisible.
Console::CursorVisible = false;

// Posición del mansaje en la ventana.
Console::SetCursorPosition(0, 0);
Console::WriteLine("Control bandeja del lector : \n\n" +
"A - Abrir bandeja. \n" +
"C - Cerrar bandeja. \n" +
"========================== \n");
//Console::WriteLine("A - Abrir bandeja.");
//Console::WriteLine("C - Cerrar bandeja.");
//Console::Write("==========================");

ConsoleKey key;
//Console::CursorVisible = false;
do
{
key = Console::ReadKey(true).Key;

String^ mensaje = "";

//Asignamos la tecla presionada por el usuario
switch (key)
{
case ConsoleKey::A:
mensaje = "Abriendo...";
Console::SetCursorPosition(0, 6);
DoEvents();
mciSendString("set CDAudio door open", rt, 127, IntPtr::Zero);
mensaje = "Abierto.";
break;

case ConsoleKey::C:
mensaje = "Cerrando...";
Console::SetCursorPosition(0, 6);
DoEvents2();
mciSendString("set CDAudio door closed", rt, 127, IntPtr::Zero);
mensaje = "Cerrado.";
break;
}

Console::SetCursorPosition(0, 6);
Console::Write("           ");
Console::SetCursorPosition(0, 6);
Console::Write(mensaje);

} while (key != ConsoleKey::Escape);
    return 0;
}


Saludos.
#14
Dudas y pedidos generales / Adaptar código a F#
Noviembre 16, 2017, 12:04:06 AM
Buenas a todos y a todas:



Quiero pasar este código en consola de C# a F#. Lo qu ehace el código es si pulsas A o la letra C abre o cierra la bandeja del lector de discos. A parte de C#, también está en C++ CLR y VB .net por si lo entienden mejor. Lo que hace el código es abrir y cerrar la bandeja de discos del lector, sea IDE o SATA.

Código C#:
Código: php
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Lector_teclado_consola_cs
{
    class Program
    {
        [DllImport("winmm.dll")]
        public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
        int uReturnLength, IntPtr hwndCallback);

        public static StringBuilder rt = new StringBuilder(127);

        public static void DoEvents()
        {
            // Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
            Console.SetCursorPosition(0, 6);
            Console.Write("Abriendo...");
        }

        public static void DoEvents2()
        {
            // Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
            Console.SetCursorPosition(0, 6);
            Console.Write("Cerrando...");
        }

        static void Main(string[] args)
        {
            // Título de la ventana.
            Console.Title = "Control lector de bandeja. C#";

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

            // Cursor invisible.
            Console.CursorVisible = false;

            // Posición del mansaje en la ventana.
            Console.SetCursorPosition(0, 0);
            Console.Write(@"Control bandeja del lector:

A - Abrir bandeja.
C - Cerrar bandeja.
===========================");



            ConsoleKey key;
            //Console.CursorVisible = false;
            do
            {
                key = Console.ReadKey(true).Key;

                string mensaje = string.Empty;

                //Asignamos la tecla presionada por el usuario
                switch (key)
                {
                    case ConsoleKey.A:
                        // mensaje = "Abriendo...";
                        Console.SetCursorPosition(0, 6);
                        DoEvents();
                        mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
                        mensaje = "Abierto.";
                        break;

                    case ConsoleKey.C:
                        // mensaje = "Cerrando...";
                        Console.SetCursorPosition(0, 6);
                        DoEvents2();
                        mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero);
                        mensaje = "Cerrado.";
                        break;
                }

                Console.SetCursorPosition(0, 6);
                Console.Write("           ");
                Console.SetCursorPosition(0, 6);
                Console.Write(mensaje);

            }
            while (key != ConsoleKey.Escape);
        }
    }
}


Código VB .net:
Código: php
Imports System.Runtime.InteropServices
Imports System.Text

Module Module1
    <DllImport("winmm.dll")>
    Public Function mciSendString(lpstrCommand As String, lpstrReturnString As StringBuilder, uReturnLength As Integer, hwndCallback As IntPtr) As Int32
    End Function

    Public rt As New StringBuilder(127)

    Public Sub DoEvents()
        ' Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
        Console.SetCursorPosition(0, 6)
        Console.Write("Abriendo...")
    End Sub

    Public Sub DoEvents2()
        ' Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
        Console.SetCursorPosition(0, 6)
        Console.Write("Cerrando...")
    End Sub

    Sub Main()
        ' Título de la ventana.
        Console.Title = "Control lector de bandeja. Visual Basic"

        ' Tamaño ventana consola.
        Console.WindowWidth = 29 ' X. Ancho.
        Console.WindowHeight = 8 ' Y. Alto.
        ' Cursor invisible.
        Console.CursorVisible = False

        ' Posición del mansaje en la ventana.
        Console.SetCursorPosition(0, 0)
        Console.Write("Control bandeja del lector:" & vbCr & vbLf & vbCr & vbLf &
                      "A - Abrir bandeja." & vbCr & vbLf &
                      "C - Cerrar bandeja." & vbCr & vbLf &
                      "===========================")

        Dim key As ConsoleKey
        'Console.CursorVisible = false;
        Do
            key = Console.ReadKey(True).Key

            Dim mensaje As String = String.Empty

            'Asignamos la tecla presionada por el usuario
            Select Case key
                Case ConsoleKey.A
                    ' mensaje = "Abriendo...";
                    Console.SetCursorPosition(0, 6)
                    DoEvents()
                    mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero)
                    mensaje = "Abierto."
                    Exit Select

                Case ConsoleKey.C
                    ' mensaje = "Cerrando...";
                    Console.SetCursorPosition(0, 6)
                    DoEvents2()
                    mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero)
                    mensaje = "Cerrado."
                    Exit Select
            End Select

            Console.SetCursorPosition(0, 6)
            Console.Write("           ")
            Console.SetCursorPosition(0, 6)

            Console.Write(mensaje)
        Loop While key <> ConsoleKey.Escape
    End Sub

End Module


Código C++ CLR:
Código: php
#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::Text;

[DllImport("winmm.dll")]
extern Int32 mciSendString(String^ lpstrCommand, StringBuilder^ lpstrReturnString,
int uReturnLength, IntPtr hwndCallback);

static void DoEvents()
{
Console::SetCursorPosition(0, 6);
Console::Write("Abriendo...");
}

static void DoEvents2()
{
Console::SetCursorPosition(0, 6);
Console::Write("Cerrando...");
}

int main(array<System::String ^> ^args)
{
StringBuilder^ rt = gcnew StringBuilder(127);

// Título de la ventana.
Console::Title = "Control lector de bandeja. C++ CLR";

// Tamaño ventana consola.
Console::WindowWidth = 29; // X. Ancho.
Console::WindowHeight = 8; // Y. Alto.

  // Cursor invisible.
Console::CursorVisible = false;

// Posición del mansaje en la ventana.
Console::SetCursorPosition(0, 0);
Console::WriteLine("Control bandeja del lector : \n\n" +
"A - Abrir bandeja. \n" +
"C - Cerrar bandeja. \n" +
"========================== \n");
//Console::WriteLine("A - Abrir bandeja.");
//Console::WriteLine("C - Cerrar bandeja.");
//Console::Write("==========================");

ConsoleKey key;
//Console::CursorVisible = false;
do
{
key = Console::ReadKey(true).Key;

String^ mensaje = "";

//Asignamos la tecla presionada por el usuario
switch (key)
{
case ConsoleKey::A:
mensaje = "Abriendo...";
Console::SetCursorPosition(0, 6);
DoEvents();
mciSendString("set CDAudio door open", rt, 127, IntPtr::Zero);
mensaje = "Abierto.";
break;

case ConsoleKey::C:
mensaje = "Cerrando...";
Console::SetCursorPosition(0, 6);
DoEvents2();
mciSendString("set CDAudio door closed", rt, 127, IntPtr::Zero);
mensaje = "Cerrado.";
break;
}

Console::SetCursorPosition(0, 6);
Console::Write("           ");
Console::SetCursorPosition(0, 6);
Console::Write(mensaje);

} while (key != ConsoleKey::Escape);
    return 0;
}


Del .net me falta F# y acabo esta curiosidad y retillo que tengo pendiente desde hace vete a saber.

¿Algún atrevido para poder abrir y cerrar la bandeja del lector usando el lenguaje F#?

Tienes que estar iniciativa para empezar y convencido para terminarlo.

Un cordial saludos a todos y a todas. ;)
#15


Tutorial Arduino C++ y Puerto serie. Puedes hacer controlar Arduino y el puerto serie desde el lenguaje C++ Win32. Hay tres IDE para elegir para crear tu propio programa en C++ como Visual Studio 2017, Code::Blocks y C++ Builder Starter.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Un cordial saludo.
#16
Hola:

Hice un programa que me ejecuta en C++ Win32 con Visual Stduio Community 2017, pero si lo compilo con code::blocks me da errores.
El código que he hecho es este.
Código: php
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "SerialClass.h"
using namespace std;

void main()
{
// Título de la ventana
SetConsoleTitle("Control Led Arduino - Visual Studio C++ 2017");

// 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 opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.

while (Puerto->IsConnected())
{
cout << endl; // Dejamos un retorno.
cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.

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

switch (opc) // Espera recibir un 1 o un 2.
{
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.
}


Sleep(250);
int n = Puerto->ReadData(lectura, 49);
if (n > 0)
{
lectura[n + 1] = '\0';
cout << "Recibido: " << lectura << endl;
cout << "-------------------" << endl;
}

cin.ignore(256, '\n'); // Limpiar buffer del teclado.
}
}


Errores indicado es este:
Citar||=== Build: Debug in Arduino_Led (compiler: GNU GCC Compiler) ===|
C:\Users\Meta\Documents\Code Blocks\Arduino_Led\Arduino_Led\main.cpp|13|error: '::main' must return 'int'|
C:\Users\Meta\Documents\Code Blocks\Arduino_Led\Arduino_Led\main.cpp||In function 'int main()':|
C:\Users\Meta\Documents\Code Blocks\Arduino_Led\Arduino_Led\main.cpp|19|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===|

¿Alguna solución?

Saludos.
#17
Hola:

Hice un programa en VB .net 2017. Me da este error con el Me y no se como solucionarlo.

¿Alguna idea?

El código es:
Código: php
Imports System
Imports System.Text
Imports System.IO.Ports
Imports System.IO
Imports System.Diagnostics
Imports System.Threading

Namespace Recibir_archivo_desde_Arduino_consola_06
    Class Program

        Shared cantidadBytes As Integer
        Shared sb As New StringBuilder()

        Shared Sub Main(args As String())
            Dim COM As String = ""
            ' Título de la ventana.
            Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro"
            ' Tamaño ventana consola.
            Console.WindowWidth = 55 ' X. Ancho.
            Console.WindowHeight = 18 ' Y. Alto.

            ' Crear un nuevo objeto SerialPort con la configuración predeterminada.
            Dim Puerto_serie As New SerialPort()
            ' Configuración.
            Console.Write("
Introduzca un número para seleccionar puerto COM.
Por ejemplo el 4, sería COM4.

Puerto: ")
            COM = Console.ReadLine() ' Escribir el número del puerto.
            Console.Clear()
            Puerto_serie.PortName = "COM" & COM ' Número del puerto serie.

            Puerto_serie.BaudRate = 115200 ' Baudios. 115200.
            Puerto_serie.Parity = Parity.None ' Paridad.
            Puerto_serie.DataBits = 8 ' Bits de datos.
            Puerto_serie.StopBits = StopBits.One ' Bits de parada.
            Puerto_serie.Handshake = Handshake.None ' Control de flujo.
            ' Establecer la lectura / escritura de los tiempos de espera.
            Puerto_serie.ReadTimeout = -1 ' 500.
            Puerto_serie.WriteTimeout = -1 ' 500.

            Puerto_serie.Open() ' Abrir el puerto serie.

            'Puerto_serie.DataReceived += New SerialDataReceivedEventHandler(DataReceivedHandler)
            AddHandler Puerto_serie.DataReceived, AddressOf Me.Puerto_serie_DataReceived
            Console.WriteLine("Esperando datos desde Arduino... " & vbLf & "")
            Console.ReadKey()
            Puerto_serie.Close() ' Cerrar puerto.

        End Sub

        Private Shared Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
            'Private Sub Puerto_serie_DataReceived(ByVal sender As Object, ByVal e As DataReceivedHandler) Handles Puerto_serie.DataReceived

            Dim sp As SerialPort = DirectCast(sender, SerialPort)
            Dim indata As String = sp.ReadExisting()
            Dim data As String() = indata.Split({"A"c})
            cantidadBytes = Integer.Parse(data(0))

            Select Case data(1).ToString()

                Case "1"
                    Console.WriteLine("Tamaño: " & cantidadBytes & " Bytes.")
                    Console.WriteLine("Foto: " & data(1) & ". Tipo de archivo: JPG")

                Case "2"
                    Console.WriteLine("Tamaño: " & cantidadBytes & " Bytes.")
                    Console.WriteLine("Foto: " & data(1) & ". Tipo de archivo: PNG.")

                Case Else
                    Console.WriteLine("Cosas raras en 'data': " & data.ToString())

            End Select

            Dim contador As Integer = 0 ' Por si hal algún error.
            Dim datosArray(0 To cantidadBytes - 1) As Byte

            Select Case indata
                Case "17729A1"
                    Thread.Sleep(100)
                    Dim miBuffer = Encoding.ASCII.GetBytes("OK1") ' Codificación ASCII.
                    sp.Write(miBuffer, 0, miBuffer.Length) ' Envía OK1 al puerto serie.

                Case "2065A2"
                    Thread.Sleep(100)
                    Dim miBuffer2 = Encoding.ASCII.GetBytes("OK2") ' Codificación ASCII.
                    sp.Write(miBuffer2, 0, miBuffer2.Length) ' Envía OK2 al puerto serie.

                Case Else
                    Console.WriteLine("Cosas raras en 'indata': " & indata.ToString())

            End Select

            While True

                contador += sp.Read(datosArray, contador, datosArray.Length - contador) ' Por si hal algún error.
                Console.SetCursorPosition(10, 6)
                Console.Write("Datos recibidos:  {0}", contador & " Bytes.")
                Console.WriteLine("                   ")
                If (contador = cantidadBytes) AndAlso (contador = 17729) Then
                    Mensaje1()
                    File.WriteAllBytes("fotón.jpg", datosArray) ' Crear archivo en el disco duro.
                    Mensaje2()
                    Process.Start("fotón.jpg") ' Ejecutar visualizador de imágenes.
                    Mensaje3()
                    'break ' Garantiza que el ciclo termine.

                End If

                If (contador = cantidadBytes) AndAlso (contador = 2065) Then
                    Mensaje1()
                    File.WriteAllBytes("fotón.png", datosArray) ' Crear archivo en el disco duro.
                    Mensaje2()
                    Process.Start("fotón.png") ' Ejecutar visualizador de imágenes.
                    Mensaje3()
                    'break ' Garantiza que el ciclo termine.

                End If

            End While

        End Sub

        Public Shared Sub Mensaje1()
            Console.WriteLine()
            Console.WriteLine("Creando archivo al disco duro...")
        End Sub


        Public Shared Sub Mensaje2()
            Console.WriteLine()
            Console.WriteLine("Archivo creado. Ejecutando imagen.")
        End Sub

        Public Shared Sub Mensaje3()
            Console.WriteLine()
            Console.WriteLine("Imagen ejecutada.")
            Console.WriteLine()
            'Console.WriteLine("Cabecera recibida: " & indata & "" & vbLf & "")
            Console.ForegroundColor = ConsoleColor.Yellow ' Letras amarillas.
            Console.WriteLine("FIN DE PROGRAMA.")
            Console.ForegroundColor = ConsoleColor.Gray ' Letras grises otra vez.
        End Sub

    End Class

End Namespace



Error:
CitarGravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   BC30043   'Me' solo es válido en un método de instancia.   Recibir_archivo_desde_Arduino_consola_VB   C:\Users\usuario\documents\visual studio 2017\Projects\Recibir_archivo_desde_Arduino_consola_VB\Recibir_archivo_desde_Arduino_consola_VB\Module1.vb   51   Activo

;)
#18
Hola:

Hice primero un código en C# para pasarlo a Java. Java me cuesta mucho entenderlo y su entorno.

Código C#:
Código: php
using System;
using System.Text;
using System.IO.Ports;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace Recibir_archivo_desde_Arduino_consola_06
{
    class Program
    {
        static int cantidadBytes;
        static StringBuilder sb = new StringBuilder();

        static void Main(string[] args)
        {
            string COM = "";
            // Título de la ventana.
            Console.Title = "Recoger foto desde Arduino y crearlo en el disco duro";

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

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

            // Configuración.
            Console.Write(@"
Introduzca un número para seleccionar puerto COM.
Por ejemplo el 4, sería COM4.

Puerto: ");
            COM = Console.ReadLine(); // Escribir el número del puerto.
            Console.Clear();

            Puerto_serie.PortName = "COM" + COM; // Número del puerto serie.


            Puerto_serie.BaudRate = 115200; // Baudios. 115200.
            Puerto_serie.Parity = Parity.None; // Paridad.
            Puerto_serie.DataBits = 8; // Bits de datos.
            Puerto_serie.StopBits = StopBits.One; // Bits de parada.
            Puerto_serie.Handshake = Handshake.None; // Control de flujo.

            // Establecer la lectura / escritura de los tiempos de espera.
            Puerto_serie.ReadTimeout = -1; // 500.
            Puerto_serie.WriteTimeout = -1; // 500.

            try
            {
                Puerto_serie.Open(); // Abrir el puerto serie.
            }

            catch (IOException)
            {
                Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
                Console.CursorVisible = false;
                Console.SetCursorPosition(16, 6);
                Console.WriteLine(@"El puerto " + Puerto_serie.PortName + @" no existe
                o no lo encuentra.");
                Console.ReadKey(); // Pulse cualquier tecla para salir.
            }

            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e);
            }
            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            Console.WriteLine("Esperando datos desde Arduino... \n");
            Console.ReadKey();
            Puerto_serie.Close(); // Cerrar puerto.
        }

        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                SerialPort sp = (SerialPort)sender;
                string indata = sp.ReadExisting();
                // string[] data = indata.Split('A');
                string[] data = indata.Split(new char[] { 'A' });
                cantidadBytes = int.Parse(data[0]);


                switch (data[1].ToString())
                {
                    case "1":
                        Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.");
                        Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: JPG");
                        break;

                    case "2":
                        Console.WriteLine("Tamaño: " + cantidadBytes + " Bytes.");
                        Console.WriteLine("Foto: " + data[1] + ". Tipo de archivo: PNG.");
                        break;

                    default:
                        Console.WriteLine("Cosas raras en 'data': " + data.ToString()); // Por si hal algún error.
                        break;
                }

                int contador = 0;
                byte[] datosArray = new byte[cantidadBytes];

                switch (indata)
                {
                    case "17729A1":
                        Thread.Sleep(100); // Retardo.
                        byte[] miBuffer = Encoding.ASCII.GetBytes("OK1"); // Codificación ASCII.
                        sp.Write(miBuffer, 0, miBuffer.Length); // Envía OK1 al puerto serie.
                        break;

                    case "2065A2":
                        Thread.Sleep(100); // Retardo.
                        byte[] miBuffer2 = Encoding.ASCII.GetBytes("OK2"); // Codificación ASCII.
                        sp.Write(miBuffer2, 0, miBuffer2.Length); // Envía OK2 al puerto serie.
                        break;

                    default:
                        Console.WriteLine("Cosas raras en 'indata': " + indata.ToString()); // Por si hal algún error.
                        break;
                }

                while (true)
                {

                    contador += sp.Read(datosArray, contador, datosArray.Length - contador);

                    Console.SetCursorPosition(10, 6);
                    Console.Write("Datos recibidos:  {0}", contador + " Bytes.");
                    Console.WriteLine("                   ");

                    if ((contador == cantidadBytes) && (contador == 17729))
                    {
                        Mensaje1();
                        File.WriteAllBytes("fotón.jpg", datosArray); // Crear archivo en el disco duro.
                        Mensaje2();
                        Process.Start("fotón.jpg"); // Ejecutar visualizador de imágenes.
                        Mensaje3();
                        break; // Garantiza que el ciclo termine.
                    }

                    if ((contador == cantidadBytes) && (contador == 2065))
                    {
                        Mensaje1();
                        File.WriteAllBytes("fotón.png", datosArray); // Crear archivo en el disco duro.
                        Mensaje2();
                        Process.Start("fotón.png"); // Ejecutar visualizador de imágenes.
                        Mensaje3();
                        break; // Garantiza que el ciclo termine.
                    }
                }

                void Mensaje1()
                {
                    Console.WriteLine();
                    Console.WriteLine("Creando archivo al disco duro...");
                }

                void Mensaje2()
                {
                    Console.WriteLine();
                    Console.WriteLine("Archivo creado. Ejecutando imagen.");
                }

                void Mensaje3()
                {
                    Console.WriteLine();
                    Console.WriteLine("Imagen ejecutada.");
                    Console.WriteLine();
                    Console.WriteLine("Cabecera recibida: " + indata + "\n");
                    Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
                    Console.WriteLine("FIN DE PROGRAMA.");
                    Console.ForegroundColor = ConsoleColor.Gray; // Letras grises otra vez.
                }
            }

            catch (FormatException)
            {
                // System.FormatException: 'La cadena de entrada no tiene el formato correcto.'
            }
        }
    }
}


Cuando ya tenga el Java, lo pruebo y les comento. En este caso es modo consola.

Un cordial saludo.
#19
Ideas y Sugerencias / Introducir sección F#
Marzo 25, 2017, 08:00:18 AM
Hola:

¿Pueden hacer una sección del foro sobre el lenguaje más nuevo llamado F#?

Así la gente se van animando sobre este nuevo lenguaje, de paso amplia el foro más rico en temas de programación y variedad.

Tutoriales para saber de que va y empezar.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Un cordial saludo.
#20
Hola:

Quiero hacer preguntas sobre Delphi, no lo he tocado desde el 7.

1. Con No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Gratis) tiene su propio componente para controlar el puerto serie sin usar librerías de terceros. ¿Delphi 10 lo incluye?

2. ¿Es verdad que existe Dephi versión gratuita tal como dice No tienes permitido ver los links. Registrarse o Entrar a mi cuenta? (No quiero registrame por gusto para luego descubrir que dura 30 días).

3. Quiero controlar el puerto serie con Arduino, de hecho, tengo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que lo pueden hacer en C#, C++ y VB .net, me falta Dephi. ¿Hay buenos ejemplos para Dephi 10?

Saludos.
#21
Dudas y pedidos generales / Cambio de código
Marzo 25, 2017, 07:23:31 AM
Hola:

Hice un código en C# primero porque lo manejo mejor que en C++. Por curiosidad quiero probar un poco de C++ Win32. El código consiste en enviar por el puerto serie datos a Arduino, él responde. También desde Arduino puede enviar datos a el PC lo recibe. La ventaja de C#, que no necesita librerías de terceros para controlar el puerto serie.

Código C#:
Código: php
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;
                }
            } while (tecla != ConsoleKey.Escape); // Pulsa Escape para salir del menú.

            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.
        }
    }
}


En C++ si necesita librería, en este caso lo puedes No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. He intentado hacerlo en C++ y me funciona a medias, aún hace cosas raras, no se hacerlo y necesito ayuda. Por ahora he hecho esto.

Código C++:
Código: php
// Para crear conexión con los puertos COM1 - COM9.
// Serial* Arduino = new Serial("COM7");

// Para crear conexión con los puertos COM10 en adelante.
// Serial* Arduino = new Serial("\\\\.\\COM10");

#include <iostream>
#include <fstream>
#include <Windows.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 opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.

while (Puerto->IsConnected())
{
cout << endl; // Dejamos un retorno.
cout << "Introduzca la opcion deseada: " << endl << endl; // Muestra texto en pantalla.

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

switch (opc) // Espera recibir un 1 o un 2.
{
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 (true) {
int n = Puerto->ReadData(lectura, 49);
if (n > 0) {
lectura[n + 1] = '\0';
break;
}
Sleep(1);
}
cout << "Recibido: " << lectura << endl;
cout << "-------------------" << endl;
}
}


¿Alguna ayuda? ;)

Saludos.