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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Temas
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 66
61  Programación / .NET (C#, VB.NET, ASP) / Escribir bien las tildes, ñ y demás en: 26 Diciembre 2021, 16:28 pm
Hola:

Quiero hacer este ejemplo y no muestra bien los caracteres en consola.

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Codificación_UTF_8_01
  8. {
  9.    internal class Program
  10.    {
  11.        static void Main(string[] args)
  12.        {
  13.            #region Configuración ventana.
  14.            // Título de la ventana.
  15.            Console.Title = "Encoder UTF-8";
  16.  
  17.            // Tamaño de la ventana, x, y.
  18.            Console.SetWindowSize(80, 25);
  19.  
  20.            // Color de fondo.
  21.            Console.BackgroundColor = ConsoleColor.Gray;
  22.  
  23.            // Color de las letras.
  24.            Console.ForegroundColor = ConsoleColor.Black;
  25.  
  26.            // Limpiar pantalla y dejarlo todo gris.
  27.            Console.Clear();
  28.  
  29.            // Visible el cursor.
  30.            Console.CursorVisible = true;
  31.            #endregion
  32.  
  33.            // Cree una codificación UTF-8.
  34.            UTF8Encoding utf8 = new UTF8Encoding();
  35.  
  36.            // Una cadena Unicode con dos caracteres fuera de un rango de código de 8 bits.
  37.            String unicodeString =
  38.                "Esta cadena Unicode tiene 2 caracteres fuera del " +
  39.                "rango ASCII:\n" +
  40.                "Pi (\u03a0), y Sigma (\u03a3).";
  41.            Console.WriteLine("Cadena original:");
  42.            Console.WriteLine(unicodeString);
  43.  
  44.            // Codifica la cadena.
  45.            Byte[] encodedBytes = utf8.GetBytes(unicodeString);
  46.            Console.WriteLine();
  47.            Console.WriteLine("Bytes codificados:");
  48.            for (int ctr = 0; ctr < encodedBytes.Length; ctr++)
  49.            {
  50.                Console.Write("{0:X2} ", encodedBytes[ctr]);
  51.                if ((ctr + 1) % 25 == 0)
  52.                    Console.WriteLine();
  53.            }
  54.            Console.WriteLine();
  55.  
  56.            // Decodifica bytes de nuevo a cadena.
  57.            String decodedString = utf8.GetString(encodedBytes);
  58.            Console.WriteLine();
  59.            Console.WriteLine("Bytes decodificados:");
  60.            Console.WriteLine(decodedString);
  61.  
  62.            // Pulse cualquier tecla para salir.
  63.            Console.ReadKey();
  64.        }
  65.    }
  66. }

Dejo aquí la captura.


Ni copiando el propio código de MicroSoft funciona.

Saludos.
62  Programación / .NET (C#, VB.NET, ASP) / ¿Cómo enviar más de 255 letras? en: 26 Diciembre 2021, 02:39 am
Buenas:

Quiero enviar un email en modo consola que supere los 255 caracteres tal como se hace en cualquier navegador.

¿Es posible hacerlo?

Aquí dejo un ejemplo con  Ggail.
Código:
// Activar / desactivar Acceso de aplicaciones poco seguras en Google.
// https://myaccount.google.com/lesssecureapps

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)
        {
            #region Configuración ventana.
            // Título de la ventana.
            Console.Title = "Gestor correo electrónico";

            // Tamaño de la ventana, x, y.
            Console.SetWindowSize(80, 25);

            // 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

            // Variables.
            string usuario, contraseña, destinatario, asunto, mensaje;

            // 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();

                //----------------------------------------------
                byte[] bytes = new byte[2000]; // Nuevo tamanho máximo.
                Stream inputStream = Console.OpenStandardInput(bytes.Length);
                Console.SetIn(new StreamReader(inputStream));
                //----------------------------------------------

                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.Write("\t\tMensaje: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                mensaje = Console.ReadLine();
                Console.WriteLine();

                MailMessage correo = new MailMessage(usuario, destinatario, asunto, mensaje);

                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 < 4)
                    {
                        Console.Write("*");
                    }
                    contador++;
                }

                else
                {
                    break;
                }

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

Felices fiestas camaradas.
63  Programación / .NET (C#, VB.NET, ASP) / Se pierde los datos guardados en un rchivo txt en: 22 Agosto 2021, 10:28 am
Hola gente del foro:

¿Cómo están?

Tengo un programa que al ejecutarlo, con el teclado Enter y las flechas puedo escribir. Pulso Enter y le doy en Guardar con Enter otra vez.

Cierro el programa, lo vuelvo abrir.

Si ejecuto y cierro el programa, misteriosamente el archivo .txt está todo borrado, sobre todo si lo hago rápido.

¿Por qué ocurre esto?

¿Hay alguna forma de solucionarlo?

Código completo C#:
Código
  1. using System;
  2. using System.IO;
  3.  
  4. namespace LCD_nombre_archivo_consola_12
  5. {
  6.    class Program
  7.    {
  8.        // Variables.
  9.        static string guardarNombre = ""; // Guardar nombre escrito.
  10.        static int coordenadaX = 0; // Coordenada X del setCursorPisition.
  11.        static ConsoleKey tecla; // Guarda cualquier tecla pulsada.
  12.        static int index = 0; // Índice.
  13.  
  14.        // Caracteres de este array.
  15.        static readonly char[] roALFANUMERICO = new char[]
  16.        {
  17.         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
  18.         'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  19.         'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
  20.         'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','.', ',', '-', '_', ':', ';',
  21.         '¿', '?', '(', ')', '[', ']', '{', '}', '<', '>', '=', '$', '&', '@', '\'', '"', ' '
  22.        };
  23.  
  24.        // Dirección del carácter del array. El 83 presenta al espacio ' ' del array roALFANUMERICO indicado justo arriba.
  25.        // Hay un total de 85 caracteres. Se cuenta desde el 0 al 84.
  26.        static readonly int[] roINDICE_ARRAY = new int[]
  27.        {
  28.         84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84
  29.        };
  30.  
  31.        // Palabras del array para imprimir en pantalla.
  32.        static readonly string[] roTEXTO = new string[] { "ATRÁS", "GUARDAR" };
  33.  
  34.        static void Main(string[] args)
  35.        {
  36.            // Título de la pantalla.
  37.            Console.Title = "Cambiar nombre";
  38.  
  39.            Inicio();
  40.        }
  41.  
  42.        static void MainMenu()
  43.        {
  44.            Console.Clear(); // Limpiar pantalla.
  45.  
  46.            Console.SetCursorPosition(0, 0);
  47.            Console.Write("Nombre del relé 1:  ");
  48.            Console.SetCursorPosition(0, 1);
  49.  
  50.            // Recorre el índice del array, del 0 hasta donde llegue.
  51.            for (int i = 0; i < roINDICE_ARRAY.Length; i++)
  52.            {
  53.                // Imprime los caracteres del array.
  54.                Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
  55.            }
  56.  
  57.            Console.SetCursorPosition(3, 3);
  58.            Console.Write(roTEXTO[0]); // ATRÁS.
  59.            Console.SetCursorPosition(12, 3);
  60.            Console.Write(roTEXTO[1]); // GUARDAR.
  61.        }
  62.  
  63.        #region Inicio.
  64.        static void Inicio()
  65.        {
  66.            Console.SetWindowSize(20, 5); // Residemensiona pantalla. X = 20, Y = 5.
  67.            Console.BackgroundColor = ConsoleColor.Gray; // Fondo gris.
  68.            Console.ForegroundColor = ConsoleColor.Black; // Letras negras.
  69.  
  70.            // ¿El archivo Existe?
  71.            if (File.Exists("Archivo.txt"))
  72.            {
  73.                // Sí. Lee el archivo de texto.
  74.                string nombre = File.ReadAllText("Archivo.txt");
  75.                int a, b; // Almacena ídice array.
  76.                for (a = 0; a < nombre.Length; a++)
  77.                {
  78.                    for (b = 0; roALFANUMERICO[b] != nombre[a]; b++)
  79.                    {
  80.                        ;
  81.                    }
  82.                    roINDICE_ARRAY[a] = b; // b indica índice y lo añade al roINDICE_ARRAY.
  83.                }
  84.            }
  85.            // No. El Archivo.txt no existe.
  86.            else
  87.            {
  88.                // Crea un archivo nuevo, escribe el contenido en el archivo y, a continuación, lo cierra.
  89.                // Si el archivo de destino ya existe, se sobrescribe.
  90.                File.WriteAllText("Archivo.txt", guardarNombre);
  91.            }
  92.  
  93.            MainMenu(); // Dibuja el menú.
  94.  
  95.            while (true)
  96.            {
  97.                Console.CursorVisible = true; // Cursor invisible.
  98.                index = 0;
  99.  
  100.                // Si se cumple estas condiciones, Enter, flecha izquierda, flecha derecha
  101.                if ((tecla == ConsoleKey.Enter) || (tecla == ConsoleKey.RightArrow) || (tecla == ConsoleKey.LeftArrow))
  102.                {
  103.                    MainMenu(); // Dibuja el menú.
  104.                }
  105.  
  106.                // Posiciona cursor.
  107.                Console.SetCursorPosition(coordenadaX, 1);
  108.  
  109.                // Almacena en la variable tecla, la tecla pulsada.
  110.                tecla = Console.ReadKey(true).Key;
  111.  
  112.                // Si coincide una tecla pulsada.
  113.                switch (tecla)
  114.                {
  115.                    case ConsoleKey.RightArrow: // Flecha derecha detectada.
  116.                        // ¿CoordenadaX menor que 15?
  117.                        if (coordenadaX < 15)
  118.                        {
  119.                            coordenadaX++; // Sí. Añada + 1 en la coordenadaX.
  120.                        }
  121.                        // No. Sale de aquí.
  122.                        break;
  123.  
  124.                    case ConsoleKey.LeftArrow: // Flecha izquierda detectada.
  125.                        // ¿coordenadaX es mayor que 0?
  126.                        if (coordenadaX > 0)
  127.                        {
  128.                            coordenadaX--; // Sí. Decremente o quita -1.
  129.                        }
  130.                        // No. Sale de aquí.
  131.                        break;
  132.  
  133.                    case ConsoleKey.UpArrow: // Flecha arriba.
  134.                        roINDICE_ARRAY[coordenadaX]++; // En el índice del array añade + en coordenadaX.
  135.                        // ¿El índice del array es mayor o igual que el array Alfanumérico?
  136.                        if (roINDICE_ARRAY[coordenadaX] >= roALFANUMERICO.Length)
  137.                        {
  138.                            roINDICE_ARRAY[coordenadaX] = 0; // Sí. Deja en 0 la coordenada del índice del array.
  139.                        }
  140.                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
  141.                        break;
  142.  
  143.                    case ConsoleKey.DownArrow: // Flecha abajo detectado.
  144.                        roINDICE_ARRAY[coordenadaX]--; // Decrementa a -1 el índice del array.
  145.                        // ¿La coordenadaX del indice del array es menor que 0?
  146.                        if (roINDICE_ARRAY[coordenadaX] < 0)
  147.                        {
  148.                            // Sí. Imprimir el valor alfanumérico.
  149.                            roINDICE_ARRAY[coordenadaX] = roALFANUMERICO.Length - 1;
  150.                        }
  151.                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
  152.                        break;
  153.  
  154.                    case ConsoleKey.Enter: // Detecta la tecla Enter.
  155.                        Console.SetCursorPosition(1, 3); // Posición del cursor.
  156.                        Console.CursorVisible = false; // Se oculta el cursor.
  157.                        Console.Write(">"); // Imprime en pantalla >.
  158.  
  159.                        // ¿La tecla almacenada es distinto a la tecla Enter?
  160.                        while ((tecla = Console.ReadKey(true).Key) != ConsoleKey.Enter)
  161.                        {
  162.                            // Sí.
  163.                            switch (tecla)
  164.                            {
  165.                                case ConsoleKey.RightArrow:
  166.                                    index = 1;
  167.                                    Console.SetCursorPosition(1, 3);
  168.                                    Console.Write(" ");
  169.                                    Console.SetCursorPosition(10, 3);
  170.                                    Console.Write(">");
  171.                                    break;
  172.                                case ConsoleKey.LeftArrow:
  173.                                    Console.SetCursorPosition(10, 3);
  174.                                    Console.Write(" ");
  175.                                    Console.SetCursorPosition(1, 3);
  176.                                    Console.Write(">");
  177.                                    index = 0;
  178.                                    break;
  179.  
  180.                                case ConsoleKey.UpArrow:
  181.                                    Inicio();
  182.                                    break;
  183.  
  184.                                case ConsoleKey.DownArrow:
  185.                                    Inicio();
  186.                                    Console.SetCursorPosition(coordenadaX, 1);
  187.                                    break;
  188.                            }
  189.                        }
  190.  
  191.                        if (index == 0)
  192.                        {
  193.                            Atras();
  194.                        }
  195.                        if (index == 1)
  196.                        {
  197.                            Guardar();
  198.                        }
  199.                        break;
  200.                }
  201.            }
  202.        }
  203.        #endregion
  204.  
  205.        static void Atras()
  206.        {
  207.            Console.Clear();
  208.            Console.SetCursorPosition(0, 1);
  209.            Console.Write("HAS PULSADO ATRÁS   ");
  210.            Console.ReadKey(); // Pulse cualquier tecla para salir.
  211.        }
  212.  
  213.        static void Guardar()
  214.        {
  215.            guardarNombre = "";
  216.            Console.Clear(); // Limpia la pantalla.
  217.  
  218.            // Lee todo el contennido del array y lo guarda en guardarNombre.
  219.            for (int a = 0; a < roINDICE_ARRAY.Length; a++)
  220.            {
  221.                guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
  222.            }
  223.            Console.SetCursorPosition(0, 2);
  224.            Console.Write(guardarNombre); // Imprime el contenido.
  225.  
  226.            // Crear Archivo.txt y el contenido de guardarNombre.
  227.            File.WriteAllText("Archivo.txt", guardarNombre);
  228.  
  229.            Console.SetCursorPosition(0, 1);
  230.            Console.Write("HAS GUARDADO       ");
  231.  
  232.            // Pulsa otra vez tecla.
  233.            Console.ReadKey();
  234.        }
  235.    }
  236. }

Saludos camaradas.

Edito:
Ya funciona. Tenía que poner el else despuués del if, para que no se ejecute siempre, que lo tenía en el aire. Aún así voy a leer atentamente tus consejos.
64  Programación / .NET (C#, VB.NET, ASP) / No concigo resolver el código de error en: 20 Abril 2021, 18:35 pm
Hola:

Al ejecutar el programa me sale este error.
System.OverflowException: 'Valor demasiado grande o demasiado pequeño para Int32.'

Con cretamente aquí.
Código:
int Variar_este_valor = Convert.ToInt32(Recibidos);

Código del programa.
Código
  1. using System;
  2. using System.IO.Ports; // No olvidar.
  3. using System.IO;
  4.  
  5. namespace Porcentaje_Barra_Puerto_Serie_Consola_03
  6. {
  7.    class Program
  8.    {
  9.        public static string recibidos = "";
  10.        public static double Resultado_Porcentaje = 0;
  11.        public static double Resultado_Voltios = 0;
  12.        public static double Mitad_barra = 0;
  13.        public static int Contador = 1;
  14.  
  15.  
  16.        static void Main(string[] args)
  17.        {
  18.            #region Configuración ventana.
  19.            // Título de la ventana.
  20.            Console.Title = "Puerto serie C# - 2019";
  21.  
  22.            // Tamaño de la ventana, x, y.
  23.            Console.SetWindowSize(100, 35);
  24.  
  25.            // Color de fondo.
  26.            Console.BackgroundColor = ConsoleColor.DarkBlue;
  27.  
  28.            // Color de las letras.
  29.            Console.ForegroundColor = ConsoleColor.Yellow;
  30.  
  31.            // Limpiar pantalla y dejarlo todo en color de fondo.
  32.            Console.Clear();
  33.  
  34.            // Visible el cursor.
  35.            Console.CursorVisible = true;
  36.            #endregion
  37.            string COM = "";
  38.  
  39.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  40.            SerialPort serialPort1 = new SerialPort();
  41.  
  42.            // Configuración.
  43.            Console.Write(@"
  44. Introduzca un número para seleccionar puerto COM.
  45. Por ejemplo el 4, sería COM4.
  46.  
  47. Puerto: ");
  48.            COM = Console.ReadLine(); // Escribir el número del puerto.
  49.            Console.Clear();
  50.  
  51.            serialPort1.PortName = "COM" + COM; // Número del puerto serie.
  52.  
  53.            // Crear un nuevo objeto SerialPort con la configuración predeterminada.
  54.  
  55.            // Configuración del puerto serie.
  56.            serialPort1.BaudRate = 9600;            // Baudios o velocidad. 115200
  57.            serialPort1.Parity = Parity.None;       // Sin paridad.
  58.            serialPort1.DataBits = 8;               // 8 Bits de datos.
  59.            serialPort1.StopBits = StopBits.Two;    // Bits de parada.
  60.            serialPort1.Handshake = Handshake.None; // Control de flujo.
  61.            serialPort1.ReadBufferSize = 4096;      // Tamaño del Búffer de lectura en Bytes.
  62.            serialPort1.WriteBufferSize = 2048;     // Tamaño del Búffer de escritura en Bytes.
  63.            serialPort1.ReadTimeout = 500;          // Establecer lectura de espera.
  64.            serialPort1.WriteTimeout = 500;         // Establecer escritura de espera.
  65.            serialPort1.DtrEnable = false;
  66.            serialPort1.RtsEnable = false;
  67.  
  68.  
  69.            try
  70.            {
  71.                serialPort1.Open(); // Abrir el puerto serie.
  72.            }
  73.  
  74.            catch (IOException)
  75.            {
  76.                Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
  77.                Console.CursorVisible = false;
  78.                Console.SetCursorPosition(16, 6);
  79.                Console.WriteLine(@"El puerto " + serialPort1.PortName + @" no existe
  80.            o no lo encuentra.");
  81.            }
  82.  
  83.            serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  84.  
  85.            Console.Read();
  86.            serialPort1.Close(); // Cerrar puerto.
  87.        }
  88.  
  89.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  90.  
  91.        {
  92.  
  93.            try
  94.            {
  95.                SerialPort sp = (SerialPort)sender;
  96.                recibidos = sp.ReadExisting();
  97.                //Console.Clear();
  98.  
  99.                recibidos = recibidos.Replace("\n\r", "");
  100.  
  101.                int Variar_este_valor = Convert.ToInt32(recibidos);
  102.  
  103.                Resultado_Porcentaje = Variar_este_valor * (100.00 / 1023.00);
  104.                Resultado_Voltios = Variar_este_valor * (5.00 / 1023.00);
  105.  
  106.  
  107.                Console.SetCursorPosition(0, 1);
  108.                Console.Write("Datos recibidos: ");
  109.                Console.SetCursorPosition(17, 1);
  110.                Console.Write("    ");
  111.                Console.SetCursorPosition(17, 1);
  112.                Console.Write(recibidos);
  113.  
  114.                // Dibujamos la barra del portentaje.
  115.                Console.SetCursorPosition(0, 3);
  116.                Console.Write("0 %                     50 %                   100 %");
  117.                Console.SetCursorPosition(0, 4);
  118.                Console.Write("&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;");
  119.                Console.Write("                                                  ");
  120.                Console.ForegroundColor = ConsoleColor.Yellow;
  121.  
  122.                // Se dibide por dos la barra del porcentaje para que quepa decuadamente en la pantalla.
  123.                Mitad_barra = Resultado_Porcentaje / 2;
  124.  
  125.                if (Mitad_barra > 50)
  126.                {
  127.                    Mitad_barra = 50;
  128.                }
  129.  
  130.                // Console.SetCursorPosition(0, 5);
  131.                ClearCurrentConsoleLine();
  132.                // Barra de progreso.
  133.                for (int i = 1; i <= Mitad_barra; i++)
  134.                {
  135.                    Console.Write("&#9608;"); // Muestra ASCII 219 Dec y DB en Hex.
  136.                                        // Console.Write((char)219);
  137.                                        // Console.Write(Encoding.ASCII.GetBytes((char)219));
  138.                }
  139.  
  140.                // Si sobre pasa 100, muestra # al final de la barra del porcentaje de color rojo.
  141.                if (Resultado_Porcentaje >= 100)
  142.                {
  143.                    Console.SetCursorPosition(50, 5);
  144.                    Console.ForegroundColor = ConsoleColor.Red;
  145.                    Console.Write("#");
  146.                }
  147.  
  148.                Console.ForegroundColor = ConsoleColor.Gray; // Vuelve al color gris.
  149.  
  150.                // Línea 7.
  151.                Console.SetCursorPosition(0, 7);
  152.                Console.Write("Porcentaje: ");
  153.                Console.SetCursorPosition(12, 7);
  154.                Console.Write("            ");
  155.                Console.SetCursorPosition(12, 7);
  156.                Console.Write(Resultado_Porcentaje.ToString("N0") + " %.");
  157.  
  158.                // Línea 8.
  159.                Console.SetCursorPosition(0, 8);
  160.                Console.Write("Voltios: ");
  161.                Console.SetCursorPosition(12, 8);
  162.                Console.Write("            ");
  163.                Console.SetCursorPosition(12, 8);
  164.                Console.Write(Resultado_Voltios.ToString("N2") + " V.");
  165.  
  166.            }
  167.  
  168.            catch (FormatException)
  169.            {
  170.                // Console.WriteLine("La cadena de entrada no tiene el formato correcto.");
  171.                Console.SetCursorPosition(0, 10);
  172.                Console.Write("                 ");
  173.                Console.SetCursorPosition(0, 10);
  174.                Console.Write("Contador: " + Contador++);
  175.                // return;
  176.            }
  177.  
  178.        }
  179.  
  180.        public static void ClearCurrentConsoleLine()
  181.        {
  182.            int currentLineCursor = Console.CursorTop;
  183.            Console.SetCursorPosition(0, Console.CursorTop);
  184.            Console.Write(new string(' ', Console.WindowWidth));
  185.            Console.SetCursorPosition(0, currentLineCursor);
  186.        }
  187.    }
  188. }

Rara vez el programa se ejecuta pero tiene otro comportamiento parpadeante en la pantalla pero muestra los datos un poco incómodo. Voy por partes.

Saludos.
65  Programación / .NET (C#, VB.NET, ASP) / Indicar bien valores de un Byte en concreto en: 20 Abril 2021, 07:26 am
Hola:

Este programa consiste en leer bits en ciertos Bytes. En este manual que puedes ver aquí.

Ver manual en pdf.

Página 7 / 21.

Concretamente en el Byte S2 y en los bit 6 y 5 se puede hacer una combinación en 4 estados que tiene que ser así:

6 - 5
------
0 - 0 normal [always use this value]
0 - 1 boost one stage
1 - 0 boost two stages
1 - 1 buck one stag



Rrecordando que los bits 6 y 5 del Byte S2 entre estos dos hay cuatro combinaciones indicado justo arriba.

Por ejemplo, si el Byte S2 tiene la combinación de los bits 6 y 5 de esta manera.

bit 6 igual a 0 y el bit 5 igual a 1, muestra el mensaje boost one stage.

Porque 0 - 1 es el que le corresponde y se muestra en pantalla. Sol me falta completar esta parte.

Dejo el código completo .
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Delimitador_consola_03
  8. {
  9.    class Program
  10.    {
  11.        static void Main(string[] args)
  12.        {
  13.            #region Configuración ventana.
  14.            // Título de la ventana.
  15.            Console.Title = "Probando manipulación de cadena";
  16.  
  17.            // Tamaño de la ventana, x, y.
  18.            Console.SetWindowSize(100, 35);
  19.  
  20.            // Color de fondo.
  21.            Console.BackgroundColor = ConsoleColor.DarkBlue;
  22.  
  23.            // Color de las letras.
  24.            Console.ForegroundColor = ConsoleColor.Yellow;
  25.  
  26.            // Limpiar pantalla y dejarlo todo en color de fondo.
  27.            Console.Clear();
  28.  
  29.            // Visible el cursor.
  30.            Console.CursorVisible = true;
  31.            #endregion
  32.  
  33.            // Cree una codificación ISO-8859-1.
  34.            Encoding ISO_8859_1 = Encoding.GetEncoding("ISO-8859-1");
  35.  
  36.            #region Variables.
  37.            // Partir a trocitos estos caracteres.
  38.            char[] delimitadorComandoB = { '#', ',', 'O', 'I', 'L', 'B', 'V', 'F', 'H', 'R', 'S', };
  39.  
  40.            // Es la cadena de caracteres que me llegó desde el puerto serie.
  41.            // En este ejemplo lo dejo en la varible directamente.
  42.            // Una cadena completa empieza con # y termina en <cr>, o lo que es lo mismo, /r.
  43.            string respuestaB = "#I223.3O224.0L000B100V26.4F50.2H50.2R0080S„€€„À"; // Comando B.
  44.  
  45.            // Se guarga en este array tipo string los datos ya partidos a tozos.
  46.            string[] palabrasB = respuestaB.Split(delimitadorComandoB);
  47.  
  48.            // Tabla S1 descripción.
  49.            string[] DESCRIPCION_S1 =
  50.            {
  51.                "Indica que este byte está disponible y es válido. [Siempre 1]",             // Posición [0].
  52.                "Indica falla de energía de la red pública; ver detalles en S2.0 y S2.1.",
  53.                "Indica que la capacidad de la batería es menor que el umbral de apagado.",
  54.                "Indica que el zumbador está en estado de pitido.",
  55.                "Indica que la prueba de batería se está procesando.",
  56.                "Indica que el apagado programado está pendiente.",
  57.                "Indica que la restauración programada está pendiente.",
  58.                "Indica falla de hardware; ver detalles sobre el comando X71."               // Posición [7].
  59.            };
  60.  
  61.            string[] DESCRIPCION_S2 =
  62.            {
  63.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  64.                "--",
  65.                "XX",
  66.                "Indica sobretemperatura del inversor.",
  67.                "Indica que el inversor tiene una falla.",
  68.                "Indica que el inversor está apagado.",
  69.                "Indica que la frecuencia de la utilidad está fuera de rango.",
  70.                "Indica que el voltaje de la red pública está fuera de rango."
  71.            };
  72.  
  73.            string[] DESCRIPCION_S3 =
  74.            {
  75.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  76.                "Indica que la batería está completamente cargada.",
  77.                "Indica que la capacidad de la batería aún es menor que el umbral restaurado del UPS cuando la energía de la red pública restaurado.",
  78.                "Indica que la batería se está cargando.",
  79.                "Indica que la batería se está descargando.",
  80.                "Indica que la capacidad de la batería es inferior al 80 por ciento.",
  81.                "Reservado, debe ser 0.",
  82.                "Indica que la batería no está presente."
  83.            };
  84.  
  85.            string[] DESCRIPCION_S4 =
  86. {
  87.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  88.                "Indica que el bypass es una sobrecarga.",
  89.                "Indica que la derivación está activa.",
  90.                "Indica que la salida sufre un cortocircuito.",
  91.                "Indica que la salida tiene carga.",
  92.                "Indica que la salida está sobrecargada.",
  93.                "Indica que la frecuencia de salida está fuera de rango en bypass.",
  94.                "Indica que el voltaje de salida está fuera de rango en derivación."
  95.            };
  96.  
  97.            string[] DESCRIPCION_S5 =
  98. {
  99.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  100.                "Indica que no hay salida.",
  101.                "Para indicar que el tiempo de ejecución restante es inferior al umbral.",
  102.                "Para indicar que el zumbador está silenciado (no permanente) en este momento.",
  103.                "Para indicar falla de cableado.",
  104.                "Para indicar SAI en modo ECO.",
  105.                "Para indicar UPS en Bypass manual.",
  106.                "Arreglar 0."
  107.            };
  108.  
  109.            string[] DESCRIPCION_S6 =
  110.            {
  111.                "Para indicar que este byte está disponible y es válido. [Siempre 1].",
  112.                "Indica UPS encendido.",
  113.                "Reservado, debe ser 0.",
  114.                "Reservado, debe ser 0.",
  115.                "Reservado, debe ser 0.",
  116.                "Reservado, debe ser 0.",
  117.                "Reservado, debe ser 0.",
  118.                "Reservado, debe ser 0."
  119.            };
  120.  
  121.            bool boolS1 = true;
  122.            bool boolS2 = false;
  123.            bool boolS3 = false;
  124.            bool boolS4 = false;
  125.            bool boolS5 = false;
  126.            bool boolS6 = false;
  127.            bool boolContador = true;
  128.            bool boolContador2 = false;
  129.            #endregion
  130.  
  131.            // Comando B.
  132.            Console.WriteLine();
  133.  
  134.            // Muestra los resultados en pantalla.
  135.            Console.WriteLine();
  136.            Console.WriteLine("El voltaje de la utilidad es de {0} voltios. ", palabrasB[2]); // I.
  137.            Console.WriteLine("El voltaje de salida del UPS es de {0} voltios. ", palabrasB[3]); // O.
  138.            Console.WriteLine("La carga actual de UPS es del {0} por ciento. ", palabrasB[4]); // L.
  139.            Console.WriteLine("La capacidad de la batería es del {0} por ciento. ", palabrasB[5]); // B.
  140.            Console.WriteLine("El voltaje de la batería es de {0} voltios. ", palabrasB[6]); // V.
  141.            //Console.WriteLine("La temperatura del gabinete del UPS es de {0} grados centígrados. ", palabrasB[7]); // T. No hay T. en mi versión.
  142.            Console.WriteLine("La frecuencia de salida del SAI es de {0} Hz. ", palabrasB[7]); // F.
  143.            Console.WriteLine("La frecuencia de salida del SAI es de {0} Hz. ", palabrasB[8]); // H.
  144.            Console.WriteLine("El tiempo de funcionamiento restante de la batería es de {0} minutos. ", palabrasB[9]);
  145.            //Console.WriteLine(@"Estos son los bits de estados que no se entiende.S:
  146.            //Aquí hay que leer cada bits como cuando se leyeron cada Byte arriba: ", (char)palabrasB[10]);
  147.  
  148.            char[] bits = palabrasB[10].ToCharArray();
  149.  
  150.            //int byteS1 = (byte)bits[0];
  151.            //int byteS2 = (byte)bits[1];
  152.            //int byteS3 = (byte)bits[2];
  153.            //int byteS4 = (byte)bits[3];
  154.            //int byteS5 = (byte)bits[4];
  155.            //int byteS6 = (byte)bits[5];
  156.  
  157.            //Console.WriteLine("Byte S1: {0}", byteS1.ToString());
  158.            //Console.WriteLine("Byte S2: {0}", byteS2.ToString());
  159.            //Console.WriteLine("Byte S3: {0}", byteS3.ToString());
  160.            //Console.WriteLine("Byte S4: {0}", byteS4.ToString());
  161.            //Console.WriteLine("Byte S5: {0}", byteS5.ToString());
  162.            //Console.WriteLine("Byte S6: {0}", byteS6.ToString());
  163.  
  164.  
  165.            //Console.WriteLine();
  166.            //Console.WriteLine(((byteS1 & 128) == 128) ? "ACTIVADO" : "DESACTIVADO");
  167.            //Console.WriteLine(((byteS1 & 128) == 128) ? "1" : "0");
  168.            //Console.WriteLine();
  169.  
  170.            Tabla();
  171.            int contador = 0;
  172.            for (int b = 0; b < bits.Length; b++)
  173.            {
  174.                for (int a = 7; a >= 0; a--)
  175.                {
  176.  
  177.                    Console.Write((((byte)bits[b]) & (1 << a)) >> a);
  178.                    Console.Write(" | ");
  179.  
  180.                    if ((contador <= 7) && (boolS1 == true))
  181.                    {
  182.                        Console.WriteLine(DESCRIPCION_S1[contador]);
  183.  
  184.                        if (contador == 7)
  185.                        {
  186.                            boolS1 = false;
  187.                            boolS2 = true;
  188.                            boolContador2 = true;
  189.                            contador = 0;
  190.                        }
  191.                    }
  192.                    else if ((contador <= 7) && (boolS2 == true))
  193.                    {
  194.                        Console.WriteLine(DESCRIPCION_S2[contador]);
  195.                        boolContador2 = false;
  196.                        if (contador == 7)
  197.                        {
  198.                            boolS2 = false;
  199.                            boolS3 = true;
  200.                            boolContador2 = true;
  201.                            contador = 0;
  202.                        }
  203.                    }
  204.                    else if ((contador <= 7) && (boolS3 == true))
  205.                    {
  206.                        Console.WriteLine(DESCRIPCION_S3[contador]);
  207.                        boolContador2 = false;
  208.                        if (contador == 7)
  209.                        {
  210.                            boolS3 = false;
  211.                            boolS4 = true;
  212.                            boolContador2 = true;
  213.                            contador = 0;
  214.                        }
  215.                    }
  216.                    else if ((contador <= 7) && (boolS4 == true))
  217.                    {
  218.                        Console.WriteLine(DESCRIPCION_S4[contador]);
  219.                        boolContador2 = false;
  220.                        if (contador == 7)
  221.                        {
  222.                            boolS4 = false;
  223.                            boolS5 = true;
  224.                            boolContador2 = true;
  225.                            contador = 0;
  226.                        }
  227.                    }
  228.                    else if ((contador <= 7) && (boolS5 == true))
  229.                    {
  230.                        Console.WriteLine(DESCRIPCION_S5[contador]);
  231.                        boolContador2 = false;
  232.                        if (contador == 7)
  233.                        {
  234.                            boolS5 = false;
  235.                            boolS6 = true;
  236.                            boolContador2 = true;
  237.                            contador = 0;
  238.                        }
  239.                    }
  240.                    else if ((contador <= 7) && (boolS6 == true))
  241.                    {
  242.                        Console.WriteLine(DESCRIPCION_S6[contador]);
  243.                        boolContador2 = false;
  244.                        if (contador == 7)
  245.                        {
  246.                            boolS6 = true;
  247.                            boolContador2 = true;
  248.                            contador = 0;
  249.                        }
  250.                    }
  251.  
  252.                    if (boolContador == true)
  253.                    {
  254.                        contador++;
  255.  
  256.                        if (boolContador2 == true)
  257.                        {
  258.                            contador = 0;
  259.                        }
  260.                    }
  261.                    //Console.WriteLine();
  262.                }
  263.                Console.WriteLine();
  264.            }
  265.  
  266.  
  267.            #region Tabla.
  268.            void Tabla()
  269.            {
  270.                Console.WriteLine();
  271.                Console.WriteLine("Byte | Bit | Estado | Descripción");
  272.                Console.WriteLine("-----+-----+-----------------------------------------------------------------------");
  273.            }
  274.            #endregion
  275.  
  276.            // Pulse cualquier tecla para salir.
  277.            Console.ReadKey();
  278.        }
  279.    }
  280. }

¿Cómo se soluciona este problema?

Saludos.
66  Programación / .NET (C#, VB.NET, ASP) / Configurar ventana en: 20 Abril 2021, 07:21 am
Hola:

¿Es posible configurar la ventana de la consola mediante C#?

En mi caso, quiero configurar el tamaño de la fuente mediante códigos C#. Lo puedo hacer de otra manera cambiando propiedades como indica cen la iamgen de abajo.


Las demás configuraciones si las puedo cambiar a códigos C# menos la fuente de la pantalla.

Un ejemplo.
Código:
// Título de la ventana.
            Console.Title = "Configuración ventana consola C#";

            // Tamaño de la ventana, x, y.
            Console.SetWindowSize(100, 35);

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

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

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

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

Saludos.
67  Programación / .NET (C#, VB.NET, ASP) / Corregir o quitar elementos del comBoBox en: 6 Abril 2021, 19:33 pm
Hola:

Quiero añadir unidades detectadas de si hay lectores en un PC o ordenador.

Cada vez que me detecta dos lectores en el comboBox me lo rellena así:

F
:
G
:

Como cuatros elementos cuando en realidad son dos y debe mostrarlos así:
F:
G:

Me da igual si solo también se queda como abajo.
F
G

¿Hay alguna forma de corregir estas cosas?

Saludos.
68  Programación / ASM / Juego Space Invader en asm en: 4 Abril 2021, 10:25 am
Hola:

Quiero saber si este juego en asm se puede ejecutar en Visual studio bajo C++ nativo, ya que ejecutas asm también. Lo que no se hacerlo ya que no hago pruebas desde hace añazos.

¿Es posible ejecutarlo?



Código ASM.
Código
  1. cXLimIzq       EQU  32                  ; X-Limite izquierda juego
  2.  cXLimDer       EQU  320-cXLimIzq        ; X-Limite derecha juego
  3.  cYLimSup       EQU  60                  ; Y-Limite superior juego
  4.  cYLimInf       EQU  180                 ; Y-Limite inferior juego
  5.  cIncYEDisp     EQU  1                   ; Y-incremento de los e-disparos
  6.  cTamDefFig     EQU  7*2                 ; Los words que definen la figura
  7.  cSepIniEDisp   EQU  4                   ; Separación inicial del disparo enemigo
  8.  cColorEDisp   EQU  14                  ; Color del disparo enemigo
  9.  cColorPDisp   EQU  7                   ; Color del disparo del jugador
  10.  cFigAlto       EQU  7                   ; Altura de las figuras
  11.  cFigAncho     EQU  16                  ; Anchura de las figuras
  12.  cAncho         EQU  256                 ; Anchura de la pantalla de juego
  13.  cAlto         EQU  cYLimInf-cYLimSup+1 ; Altura de la pantalla de juego
  14.  cSepMargen     EQU  3                   ; Margen de separación con el borde
  15.  cLinColor     EQU  6                   ; Color de la línea contenedora
  16.  cFrecBomb     EQU  010h                ; Frecuencia con la que empiezan a caer bombas
  17.  cNumEColumn   EQU  11                  ; Número de columnas de enemigos
  18.  cNumEnemigos   EQU  5*cNumEColumn       ; Número de enemigos
  19.  cDispEne       EQU  5                   ; Máximo num disparos x cada enemigo
  20.  cNumDispEne   EQU  7;cDispEne*cNumEColumn; Máximo disparos activos enemigos
  21.  cXESep         EQU  1                   ; X-separación entre enemigos
  22.  cYESep         EQU  3                   ; Y-separación entre enemigos
  23.  cXESup         EQU  (cAncho-((16+cXESep)*10+16))/2  ; X-inicial-superior enemigos
  24.  cYESup         EQU  cYLimSup-cYLimSup   ; Y-superior enemigos
  25.  cYPSup         EQU  cYLimInf-7-cYLimSup ; Y-superior player
  26.  cXPIzq         EQU  0                   ; X-lim izquierda player
  27.  cXPDcha       EQU  256-11              ; X-lim derecha player
  28.  cTimePlayer   EQU  0                   ; Tiempo retardo movimiento player
  29.  cTimeEnemigos EQU  20                  ; Tiempo retardo movimiento enemigos
  30.  cTimePDisp     EQU  0                   ; Tiempo retardo movimiento player-disparo
  31.  cTimeEDisp     EQU  0                   ; Tiempo retardo movimiento enemigos-disparos
  32.  cTimeESgteDisp EQU  10                  ; Tiempo retardo siguiente enemigos-disparos
  33.  cChgTEnemigos EQU  2                   ; Cada cuántos enemigos destruidos incrementan velocidad
  34.  cFilasBaja     EQU  2                   ; Filas que bajan los enemigos cada vez
  35.  cYTope         EQU  cYPSup-10           ; Tope superior que no pueden sobrepasar enemigos
  36.  cSoyInmune     EQU  0                   ; 1-soy inmune, 0-no soy inmune
  37.  cTAMTOT       EQU  1024*6              ; Este programa y su pila caben en 6Kb
  38.  cnNotas       EQU  7+6+7+5
  39.  
  40.  TEnemigos   STRUC
  41.    PosX    DW ?
  42.    PosY    DW ?
  43.    OldPosX DW ?
  44.    Def     DW ?                          ; La dirección donde está definido
  45.    Despl   DW ?                          ; El desplazamiento de offsets (+7?)
  46.    Tipo    DB ?                          ; 1, 2, 3, 4, 5
  47.    Color   DB ?
  48.    Vida    DB ?
  49.    Abajo   DB ?                          ; Sólo disparan los que estén abajo
  50.  TEnemigos   ENDS
  51.  
  52.  TCabEDisp STRUC                         ; Estructura de la cabecera de los disparos enemigos
  53.    DirDisp DW ?                          ; Dirección donde se encuentra el disparo
  54.    Vida    DB ?                          ; ¿Está vivo?
  55.  TCabEDisp ENDS
  56.  
  57.  TEDisparos   STRUC                      ; Disparos de los enemigos
  58.    PosX    DW ?
  59.    PosY    DW ?
  60.    Def     DW ?                          ; Matriz de definición del disparo
  61.    Despl   DW ?                          ;   junto con el desplazamiento de offsets (+7?)
  62.    Color   DB ?
  63.  TEDisparos   ENDS
  64.  
  65.  TPlayer   STRUC
  66.    PosX    DW ?
  67.    PosY    DW ?
  68.    Def     DW ?                          ; La dirección donde está definido
  69.    Color   DB ?
  70.    Vida    DB ?
  71.  TPlayer   ENDS
  72.  
  73.  TPDisparos   STRUC                      ; Disparos del jugador
  74.    PosX    DW ?
  75.    PosY    DW ?
  76.    Def     DW ?
  77.    Despl   DW ?                          ; El desplazamiento de offsets (+7?)
  78.    Color   DB ?
  79.    Vida    DB ?
  80.  TPDisparos   ENDS
  81.  
  82.  TNota STRUC
  83.    Frecuencia DW ?
  84.    Duracion   DB ?
  85.  TNota ENDS
  86.  
  87.  LTEnemigos   EQU SIZEOF TEnemigos
  88.  LTEDisparos EQU SIZEOF TEDisparos
  89.  LTCabEDisp   EQU SIZEOF TCabEDisp
  90.  LTPlayer     EQU SIZEOF TPlayer
  91.  LTPDisparos EQU SIZEOF TPDisparos
  92.  LTNota       EQU SIZEOF TNota
  93.  
  94.  IF1
  95.    INCLUDE ..\LIB\CtesGphM.inc           ; Constantes gráficas
  96.    INCLUDE ..\LIB\GraphMM.inc            ; Incorporamos las macros gráficas
  97.  ENDIF
  98.  
  99. codigo SEGMENT PARA PUBLIC 'CODE'         ; Abre el segmento de código
  100.  ASSUME CS:codigo, DS:codigo, ES:codigo, SS:codigo
  101.  ORG 100h                                ; COM -> comienza en 100h
  102.  Entrada PROC                            ; Abre el procedimiento
  103.    ; *** Reasigna memoria
  104.    MOV         SP, cTAMTOT               ; La base de la pila
  105.    MOV         AH, 4Ah
  106.    MOV         BX, cTAMTOT/16            ; Lo pasamos a párrafos
  107.    INT         21h                       ; Redimensionamos el bloque de memoria
  108.    JNC         $_Bien1
  109.      MOV        AH, 9
  110.      MOV        DX, OFFSET msg1
  111.      INT        21h
  112.      JMP        $_Salimos
  113.    $_Bien1:
  114.    CALL        VGAColor                  ; Comprobamos si existe VGA en color
  115.    ; Reserva memoria para el búfer pant1
  116.    MOV         BX, (cXLimDer-cXLimIzq+1)*(cYLimInf-cYLimSup+1)/16+1 ; En párrafos
  117.    CALL        ResMem
  118.    MOV         WORD PTR [ScrSeg], AX
  119.    SetMode     13h                       ; Ponemos el modo gráfico
  120.    CALL        DibMarco
  121.    CALL        SaveValSPK
  122.    CALL        Randomize
  123.    CALL        SaveOldInt9h
  124.    CALL        SetNewInt9h
  125.    CALL        SaveOldInt1Ch
  126.    CALL        SetNewInt1Ch
  127.    CALL        IniCabEDisp
  128.    CALL        ResetNivel                ; Inicializamos el nivel del juego
  129.    $_Nueva_Partida:
  130.    CALL        IniElementos              ; Inicializa valores en función de variables y constantes
  131.    $_Main:
  132.      CALL        GetPShoot               ; ¿Hemos pulsado ctrl?
  133.      CALL        GetEShoot               ; ¿Debe disparar un enemigo?
  134.      CALL        SetMotion               ; Movemos las piezas si toca
  135.      JNC         $_Next0
  136.        ; Si STC = 1 significa que los enemigos han llegado al nivel inferior: ganaron
  137.        CALL        ResetNivel            ; Inicializamos el nivel del juego
  138.        CALL        WaitUntilCtrl         ; Esperamos hasta Ctrl pulsado
  139.        JMP         $_Nueva_Partida
  140.      $_Next0:
  141.      CMP         BYTE PTR [NumEnemigos], 0
  142.      JA          $_Next1
  143.        CALL        incNivel              ; Incrementamos el nivel del juego
  144.        JMP         $_Nueva_Partida
  145.      $_Next1:
  146.      CMP         BYTE PTR [Player.Vida], 0
  147.      JA          $_Next2
  148.        CALL        ResetNivel            ; Inicializamos el nivel del juego
  149.        CALL        WaitUntilCtrl         ; Esperamos hasta Ctrl pulsado
  150.        JMP         $_Nueva_Partida
  151.      $_Next2:
  152.      CALL        ClearBuffer             ; Limpiamos el búfer
  153.      CALL        DibujaEnemigos          ; Dibujamos los enemigos en el búfer
  154.      CALL        DibujaJugador           ; Dibujamos el jugador en el búfer
  155.      CALL        DibujaPDisparo          ; Dibujamos el disparo del jugador en búfer
  156.      CALL        DibujaEDisparo          ; Dibujamos los disparos de los enemigos en búfer
  157.      CALL        CheckPDEDColision       ; ¿El disparo del jugador alcanzo al de algun enemigo?
  158.      CALL        CheckMPDColision        ; ¿El disparo del jugador alcanzo algun enemigo?
  159.      CALL        CheckMEDColision        ; ¿El disparo de los enemigos alcanzaron al jugador?
  160.      WRetrace    8                       ; Esperamos al final del retrazo
  161.      MOV         AX, WORD PTR [ScrSeg]   ; Segmento Origen
  162.      MOV         BX, __VgaSeg            ; Segmento destino: mem vídeo
  163.      CALL        Copy64K                 ; Vuelca búfer en mem vídeo
  164.      CMP         BYTE PTR [Escape], 1
  165.    JNZ         $_Main
  166.    SetMode     3h                        ; Volvemos al modo texto
  167.    CALL        RestoreOldInt1Ch
  168.    CALL        RestoreOldInt9h
  169.    CALL        TurnOffSpk
  170.    MOV         AX, WORD PTR [ScrSeg]     ; Libera memoria pantalla
  171.    CALL        LibMem
  172.    $_Salimos:
  173.    ; Salimos al DOS
  174.    MOV      AX, 4C00h                    ; Servicio 4Ch, mensaje 0
  175.    INT      21h                          ; volvemos AL DOS
  176.  Entrada ENDP                            ; cierra el procedimiento
  177.  
  178.  IF1
  179.    INCLUDE  ..\LIB\VGA_M.inc             ; Incorporamos procedimientos
  180.    INCLUDE  ..\LIB\SpcM.inc              ; Incorporamos procedimientos
  181.  ENDIF
  182.  
  183.  ; ****************
  184.  
  185.  TurnOffSpk PROC
  186.    ;  Propósito: Apaga el altavoz
  187.    ;  Entrada  : Ninguna
  188.    ;  Salida   : Ninguna
  189.    ;  Destruye : AX
  190.    MOV      AL, BYTE PTR [vbSpeaker]
  191.    AND      AL, 11111100b                ; Apagamos y descconectamos el altavoz del canal 2 del PIT
  192.    OUT      61h, AL
  193.    RET
  194.  TurnOffSpk ENDP
  195.  
  196.  SaveValSPK PROC
  197.    ;  Propósito: Guarda el valor original del puerto 61h
  198.    ;  Entrada  : Ninguna
  199.    ;  Salida   : Ninguna
  200.    ;  Destruye : AX
  201.    IN       AL, 61h
  202.    AND      AL, 11111100b
  203.    MOV      BYTE PTR [vbSpeaker], AL
  204.    RET
  205.  SaveValSPK ENDP
  206.  
  207.  Frec_Periodo PROC
  208.    ;  Propósito: Convertimos la frecuencia en período
  209.    ;  Entrada  : CX: frecuencia
  210.    ;  Salida   : DX: período
  211.    ;  Destruye : AX, DX
  212.    MOV      DX, 12h
  213.    MOV      AX, 34DCh
  214.    DIV      CX
  215.    MOV      DX, AX                       ; Lo guardamos en DX
  216.    RET
  217.  Frec_Periodo ENDP
  218.  
  219.  PIT_REG_COMM PROC
  220.    ;  Propósito: Le indicamos al PIT lo que vamos a hacer
  221.    ;  Entrada  : DX:periodo
  222.    ;  Salida   : Ninguna
  223.    ;  Destruye : AX
  224.    MOV      AL, 0B6h
  225.    OUT      43h, AL
  226.    MOV      AL, DL                       ; Pasamos el byte bajo del contador
  227.    OUT      42h, AL
  228.    MOV      AL, DH                       ; Y ahora el alto
  229.    OUT      42h, AL
  230.    RET
  231.  PIT_REG_COMM ENDP
  232.  
  233.  SpkOn PROC
  234.    ;  Propósito: Encendemos el altavoz con duración determinada
  235.    ;  Entrada  : Ninguna
  236.    ;  Salida   : Ninguna
  237.    ;  Destruye : AX
  238.    MOV      AL, BYTE PTR CS:[vbSpeaker]
  239.    OR       AL, 3
  240.    OUT      61h, AL
  241.    RET
  242.  SpkOn ENDP
  243.  
  244.  SpkOff PROC
  245.    ;  Propósito: Encendemos el altavoz con duración determinada
  246.    ;  Entrada  : Ninguna
  247.    ;  Salida   : Ninguna
  248.    ;  Destruye : AX
  249.    MOV      AL, BYTE PTR CS:[vbSpeaker]
  250.    AND      AL, 11111100b
  251.    OUT      61h, AL
  252.    RET
  253.  SpkOff ENDP
  254.  
  255.  Sonido PROC
  256.    ;  Propósito: Toca una nota en el altavoz del PC a través del PIT
  257.    ;  Entrada  : CX:frecuencia
  258.    ;  Salida   : Ninguna
  259.    ;  Destruye : Ninguna
  260.    .IF      CX == 0
  261.      CALL     SpkOff
  262.    .ELSE
  263.      CALL     Frec_Periodo
  264.      CALL     PIT_REG_COMM
  265.      CALL     SpkOn
  266.    .ENDIF
  267.    RET
  268.  Sonido ENDP
  269.  
  270.  ResetNota PROC
  271.    ; Propósito: Recogemos los valores de la nueva nota en MNota
  272.    ; entrada  : KeyTable
  273.    ; salida   : KeyTable
  274.    ; Destruye : AX
  275.    PUSH      AX
  276.    PUSH      BX
  277.    MOV       BX, WORD PTR CS:[vwActual]
  278.    MOV       AX, WORD PTR CS:[Notas1+BX]
  279.    MOV       WORD PTR CS:[MNota.Frecuencia], AX
  280.    MOV       AX, WORD PTR CS:[Notas1+BX+2]
  281.    MOV       BYTE PTR CS:[MNota.Duracion], AL
  282.    POP       BX
  283.    POP       AX
  284.    RET
  285.  ResetNota ENDP
  286.  
  287.  ; ****************
  288.  
  289.  SaveOldInt1Ch PROC NEAR
  290.    ; Propósito: Guarda la dirección de la antigua ISR de Int 1Ch
  291.    ; entrada  : OldInt1Ch
  292.    ; salida   : Ninguna
  293.    ; Destruye : AX
  294.    MOV       AX, 351Ch                   ; Obtiene la dirección de la
  295.    INT       21h                         ;     interrupción 1Ch
  296.    MOV       WORD PTR OldInt1Ch[2],ES    ; Guarda segmento
  297.    MOV       WORD PTR OldInt1Ch[0],BX    ;     y dirección
  298.    RET
  299.  SaveOldInt1Ch ENDP
  300.  
  301.  RestoreOldInt1Ch PROC NEAR
  302.    ; Propósito: Restaura la dirección de la antigua ISR de Int 1Ch
  303.    ; entrada  : OldInt1Ch
  304.    ; salida   : Ninguna
  305.    ; Destruye : AX, DX
  306.    PUSH      DS                          ; Guardamos DS
  307.    LDS       DX, OldInt1Ch               ; Carga la dirección original
  308.    MOV       AX, 251Ch                   ; Lo restaura a la tabla de vectores
  309.    INT       21h
  310.    POP       DS
  311.    RET
  312.  RestoreOldInt1Ch ENDP
  313.  
  314.  SetNewInt1Ch PROC NEAR
  315.    ; Propósito: Establece la dirección de la nueva ISR para Int 1Ch
  316.    ; entrada  : NuevaInt1Ch
  317.    ; salida   : Ninguna
  318.    ; Destruye : AX, DX
  319.    MOV       DX, OFFSET NuevaInt1Ch      ; Carga la dirección de nueva rutina
  320.    MOV       AX, 251Ch                   ; Establece la nueva interrupción
  321.    INT       21h
  322.    RET
  323.  SetNewInt1Ch ENDP
  324.  
  325.  NuevaInt1Ch PROC FAR
  326.    ; Propósito: Nueva ISR para la INT 1Ch, crea un retardo
  327.    ; entrada  : Ninguna
  328.    ; salida   : Ninguna
  329.    ; Destruye : Ninguna
  330.    PUSHF
  331.    PUSH      AX
  332.    PUSH      BX
  333.    PUSH      CX
  334.    PUSH      DX
  335.    PUSH      DS
  336.    PUSH      ES
  337.    .IF       BYTE PTR CS:[vbEjecutando] == 1
  338.      ; Si está sonando la nota
  339.      DEC       BYTE PTR CS:[MNota.Duracion]            ; Decrementamos la duración
  340.      .IF       BYTE PTR CS:[MNota.Duracion] == 0
  341.        ; Si ya ha terminado la duración de la nota
  342.        ADD       WORD PTR CS:[vwActual], 4             ; Incrementamos puntero a notas
  343.        CALL      ResetNota                             ; Recogemos nueva nota
  344.        .IF       WORD PTR CS:[vwActual] >= cnNotas*4
  345.          ; Si ya hemos terminado todas las notas
  346.          MOV       BYTE PTR CS:[vbEjecutando], 0       ; Marcamos que no tocamos
  347.          MOV       WORD PTR CS:[vwActual], 0           ; Reseteamos el puntero a notas
  348.          CALL      TurnOffSpk
  349.        .ELSE
  350.          ; Si todavía no hemos terminado todas las notas
  351.          MOV       CX, WORD PTR CS:[MNota.Frecuencia]
  352.          CALL      Sonido
  353.        .ENDIF
  354.      .ENDIF
  355.    .ELSE
  356.      ; Si no está sonando ninguna nota
  357.      .IF       BYTE PTR CS:[vbEjecutar] == 1
  358.        ; Si debemos ejecutar las notas
  359.        .IF       WORD PTR CS:[vwActual] == 0
  360.          ; Si estamos al inicio, reseteamos
  361.          CALL      ResetNota
  362.        .ENDIF
  363.        .IF       BYTE PTR CS:[MNota.Duracion] != 0
  364.          ; Si todavía dura la nota, la tocamos
  365.          MOV       BYTE PTR CS:[vbEjecutando], 1       ; Marcamos para tocar
  366.          MOV       CX, WORD PTR CS:[MNota.Frecuencia]
  367.          CALL      Sonido
  368.        .ENDIF
  369.      .ENDIF
  370.    .ENDIF
  371.    CMP       BYTE PTR CS:[TimePlayer], 0
  372.    JZ        $_Next1
  373.      DEC       BYTE PTR CS:[TimePlayer]      ; Decrementamos el contador de pulsos
  374.    $_Next1:
  375.    CMP       BYTE PTR CS:[TimeEnemigos], 0
  376.    JZ        $_Next2
  377.      DEC       BYTE PTR CS:[TimeEnemigos]      ; Decrementamos el contador de pulsos
  378.    $_Next2:
  379.    CMP       BYTE PTR CS:[TimePDisp], 0
  380.    JZ        $_Next3
  381.      DEC       BYTE PTR CS:[TimePDisp]      ; Decrementamos el contador de pulsos
  382.    $_Next3:
  383.    CMP       BYTE PTR CS:[TimeEDisp], 0
  384.    JZ        $_Next4
  385.      DEC       BYTE PTR CS:[TimeEDisp]      ; Decrementamos el contador de pulsos
  386.    $_Next4:
  387.      CMP       BYTE PTR CS:[TimeESgteDisp], 0
  388.      JZ        $_GT_Next5
  389.        DEC       BYTE PTR CS:[TimeESgteDisp]   ; Retardo para el siguiente disparo de los enemigos
  390.      $_GT_Next5:
  391.    POP       ES
  392.    POP       DS
  393.    POP       DX
  394.    POP       CX
  395.    POP       BX
  396.    POP       AX
  397.    POPF
  398.    JMP       [CS:OldInt1Ch]              ; Saltamos a la vieja rutina
  399.  NuevaInt1Ch  ENDP
  400.  
  401. TopInvader1             DW      0c00h,1e00h,2d00h,3f00h,1200h,2100h,1200h
  402. ;   0c00   0000110000000000
  403. ;   1e00   0001111000000000
  404. ;   2d00   0010110100000000
  405. ;   3f00   0011111100000000
  406. ;   1200   0001001000000000
  407. ;   2100   0010000100000000
  408. ;   1200   0001001000000000
  409. TopInvader2             DW      0c00h,1e00h,2d00h,3f00h,1200h,2100h,4080h
  410. ;   0c00   0000110000000000
  411. ;   1e00   0001111000000000
  412. ;   2d00   0010110100000000
  413. ;   3f00   0011111100000000
  414. ;   1200   0001001000000000
  415. ;   2100   0010000100000000
  416. ;   4080   0100000010000000
  417. MiddleInvader1          DW      2100h,9e40h,0ad40h,7f80h,3f00h,2100h,4080h
  418. MiddleInvader2          DW      2100h,1e00h,2d00h,7f80h,0bf40h,0a140h,1200h
  419. BottomInvader1          DW      01e00h,7f80h,0ccc0h,0ffc0h,2100h,4c80h,2100h
  420. BottomInvader2          DW      01e00h,7f80h,0ccc0h,0ffc0h,2100h,4c80h,8040h
  421. PlayersShip             DW      0400h,0e00h,7fc0h,0ffe0h,0ffe0h,0ffe0h,0000h
  422. ;   0400   0000010000000000
  423. ;   0e00   0000111000000000
  424. ;   7fc0   0111111111000000
  425. ;   ffe0   1111111111100000
  426. ;   ffe0   1111111111100000
  427. ;   ffe0   1111111111100000
  428. ;   0000   0000000000000000
  429. TwistedMissile1         DW      0000h,0000h,0000h,0800h,0400h,0800h,0400h
  430. ;   0000   0000000000000000
  431. ;   0000   0000000000000000
  432. ;   0000   0000000000000000
  433. ;   0800   0000100000000000
  434. ;   0400   0000010000000000
  435. ;   0800   0000100000000000
  436. ;   0400   0000010000000000
  437. TwistedMissile2         DW      0000h,0000h,0000h,0400h,0800h,0400h,0800h
  438. StraightMissile         DW      0000h,0000h,0000h,0400h,0400h,0400h,0400h
  439.  
  440.  MEnemigos  TEnemigos  cNumEnemigos DUP (<>)    ; Enemigos sin inicializar
  441.  MCabEDisp  TCabEDisp  cNumDispEne  DUP (<>)    ; Disparos de los enemigos
  442. ;   align 16
  443. ;   db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1             ;16
  444.  MEDisparos TEDisparos cNumDispEne  DUP (<>)    ; Disparos de los enemigos
  445.  Player     TPlayer    <>                       ; Jugador sin inicializar
  446.  MPDisparos TPDisparos <>                       ; Disparos de los enemigos
  447.  
  448.  vbSpeaker    DB   ?
  449.  vbEjecutar   DB   1                     ; Lo definimos indicando que suenen las notas
  450.  vbEjecutando DB   0
  451.  vwActual     DW   0
  452.  Notas1       DW   262, 3, 330, 3, 349, 3, 392, 3, 349, 3, 294, 3, 0, 8     ; 7
  453.               DW   262, 3, 330, 3, 349, 3, 392, 3, 349, 3,   0, 8           ; 6
  454.               DW   262, 3, 330, 3, 349, 3, 392, 3, 349, 3, 294, 3, 0, 8     ; 7
  455.               DW   330, 3, 349, 3, 330, 3, 262, 3, 262, 3                   ; 5
  456.  MNota        TNota  <>
  457.  
  458. msg1           DB  "Error al REDIMENSIONAR memoria$"
  459. msg2           DB  "Error al RESERVAR memoria$"
  460. msg3           DB  "Error al LIBERAR memoria$"
  461. msgAOE         DB  "(c)Abre los ojos al ensamblador", 13, 10
  462.               DB  "Ejemplo de space invaders$"
  463. msgExito       DB  "Enhorabuena, has salvado al planeta Tierra$"
  464. msgFracaso     DB  "Por tu impericia la Tierra ha sido destruida$"
  465. msgBlanco      DB  "                                            $"
  466. NumEnemigos    DB  ?                      ; Número de enemigos que quedan
  467. OldInt9h       DD  ?                      ; Dirección antigua de Int 9h
  468. OldInt1Ch      DD  ?                      ; Dirección antigua de Int 1Ch
  469. ScrSeg         DW  ?                      ; Segmento del búfer de pantalla
  470. DirEnemigos    DW  ?                      ; Dirección del mvto de los enemigos
  471. DesplDefFig    DW  ?                      ; Para pintar el mvto de la figura
  472. TimePlayer     DB  ?                      ; Retardo para el mvto del jugador
  473. TimeEnemigos   DB  ?                      ; Retardo para el mvto de los enemigos
  474. TimePDisp      DB  ?                      ; Retardo para el mvto disparo jugador
  475. TimeEDisp      DB  ?                      ; Retardo para el mvto disparo enemigos
  476. TimeESgteDisp  DB  ?                      ; Retardo para el siguiente disparo enemigos
  477. vNextTEnemigos DB  ?                      ; Siguiente retardo de los enemigos
  478. TicksReloj     DD  ?                      ; Ticks de reloj
  479. ActFrecBomb    DB  ?                      ; Frecuencia actual disparos enemigos (cambia)
  480. NumEColumn     DW  ?                      ; Número de columnas de enemigos que quedan
  481. ChgTEnemigos   DB  ?                      ; Cada cuantos enemigos muertos incr su velocidad
  482. vSoyInmune     DB  cSoyInmune             ; Ser o no ser inmune
  483. ; Datos modificados en cada nivel
  484. vYESup         DW  ?                      ; X-inicial-superior de los enemigos
  485. ; Datos que modifica la nueva ISR del teclado
  486. PlayerLeft     DB  0
  487. PlayerRight    DB  0
  488. PlayerFire     DB  0
  489. Escape         DB  0
  490.  
  491. codigo ENDS
  492. END Entrada

Más códigos aquí.
http://abreojosensamblador.epizy.com/?Tarea=1&SubTarea=35&i=1

Gracias.
69  Programación / .NET (C#, VB.NET, ASP) / Leer bits de Byte en: 2 Abril 2021, 13:14 pm
Buenas camaradas:

Haciendo un programa hecho con Windows Form bajo .Net FrameWotk 4.7. Si envío un comando por el puerto serie que se llama X82, recibo un mensaje que en ASCII no se entiende porque usa caracteres raros.

Lo paso a hexadecimal y en binario.

Envío un comando, ocurre algún evento y en Windoes Form me aparece cógios en HEX y en BIN. Se puede cambiar varios bit en un único Byte.

Por ejemplo, si me llega este dato.

Hexadecimal: 23C797C0B00D

Binario: 00100011 11000111 10010111 11000000 10110000 00001101

Un ejemplo, es poner muchos labels en cada bits y una tabla de cada Byte recibido. Simpre son la misma cantidad de bytes ya que en realdiad hace de Flags.

Centrándonos en el binario, ya que hay 6 Bytes.

Código
  1. 00100011 11000111 10010111 11000000 10110000 00001101
  2. -------- -------- -------- -------- -------- --------
  3. Byte I  Byte a    Byte b   Byte c   Byte d   Byte F
  4.  

En el Byte c que corresponde al 11000000 quiero leer el bit 3 que corresponde al "Extractor" indicado en la tabla de abajo. Cada Byte tiene su tabla, ahora nos centramos en un Byte y ver los estados de los bits.

bit:c Dato        Función.
7 =   1            Motor A.
6 =   1            Motor B.
5 =   0            Luz A.
4 =   0            Luz B.
3 =   0            Extractor.
2 =   0            Alarma.
1 =   0            Persiana.
0 =   0            Ventilador

El Byte c que ahora contiene estos bits que son 11000000, me llega una nueva trama de Bytes y precisamente este, cambia de 11000000 a 11001000. Solo ha cambiado un bit que es el 3 en el Byte c.

Cada bit tiene su label para mostrarlo en el formulario de Windows. La tabla de abajo se actualiza.

bit:c Dato        Función.
7 =   1            Motor A.
6 =   1            Motor B.
5 =   0            Luz A.
4 =   0            Luz B.
3 =   1            Extractor.
2 =   0            Alarma.
1 =   0            Persiana.
0 =   0            Ventilador

Antes el Byte c del bit 3 que es el Extractor estaba a 0, ahora es 1.

En resumen. Quiero saber como se leen los bits que me llegan del puerto serie.

¿Existe la posibilidad de hacer un programa así?

Saludos.

PD: En esta clase de programas que no suelo usar, es como las aves, fáciles de ver, difíciles de alcanzar.
70  Programación / .NET (C#, VB.NET, ASP) / Separar binario por cada byte en: 1 Abril 2021, 19:15 pm
Hola:

Al mostrar una trama de bytes, lo presento en binario y me muestra esto.

001000111100011110010111110000001011000000001101

Hay 6 Bytes que en realidad en hexadecimal es 23 C7 97 C0 B0 0D

Quiero que se me separe así en cada byte o cada 8 bit.

00100011 11000111 10010111 11000000 10110000 00001101

He intentado hacerlo con este código:
Código
  1.            // Pasar a binario.
  2.            foreach (string leer in recibidos.Select(c => Convert.ToString(c, 2)))
  3.  
  4.            {
  5.                richTextBox1.Text += leer.ToString();
  6.            }

Me pasa dos cosas.
Como en el ejemplo de arriba, si los bits empieza por cero y encuentro un uno, por ejemplo. 00000001, en la pantalla me aparece solo el 1 ignorando los sietes primeros 0. Me gusta más que se muestre así 00000001 en vez de tipo ahorrador con solo un 1.

La otra cosa, que por cada 8 bytes en binario se muestre separado como indicado arriba.

¿Es posible hacerlo?

Gracias.
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ... 66
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines