Enviar más de 255 carácteres

Iniciado por Meta, 10 Diciembre 2020, 01:01 AM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Buenos días camaradas:

Hice un micni chat que funciona bien entre dos PC o ordenadores de sobremesa por el puerto serie.

Cuando quiero escribir un mensaje de más de 255 letras o caracteres, no me deja. Solo me quedo con 255 y ya está.

¿Existe alguna manera de escribir mensaje en la consola más de 255 caracteres o los que quiera?

Dejo el código de ejemplo en C#.
Código (csharp) [Seleccionar]
using System;
using System.IO;
using System.IO.Ports;
using System.Threading;

namespace Introducir_datos_puerto_serie_consola_02
{
   class Program
   {
       static bool _continua;
       // Cree un nuevo objeto SerialPort con la configuración predeterminada.
       static readonly SerialPort Puerto_serie = new SerialPort("COM2");

       static void Main(string[] args)
       {
           string nombre;
           string mensaje;
           StringComparer comparaString = StringComparer.OrdinalIgnoreCase;
           Thread readThread = new Thread(Leer);

           // Título de la ventana.
           Console.Title = "Enviar datos al puerto serie";

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

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

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

           // Limpiar pantalla y dejarlo todo gris.
           Console.Clear();

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

           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; // 500 // Milisegundos.
           Puerto_serie.WriteTimeout = 500; // 500

           // Abrir puerto serie.
           Puerto_serie.Open();
           _continua = true;
           readThread.Start();

           // Mostrar texto Nombre y se
           Console.Write("Nombre: ");

           // guarda en la variable nombre.
           nombre = Console.ReadLine();

           Console.WriteLine("Escriba salir para salir");

           while (_continua)
           {
               // Cualquier caracter recibido se guarda en la variable mensaje.
               mensaje = Console.ReadLine();

               // Compara salir con el mensaje salir si lo haz escrito igual.
               // ¿Escribiste la palabra salir?
               if (comparaString.Equals("salir", mensaje))
               {
                   // Sí. Entonces, pone esta variable _continue en false.
                   _continua = false;
               }
               // No. Entonces, envía por el puerto serie tu nick
               // y mensaje que haz escrito.
               else
               {
                   Puerto_serie.WriteLine(
                       String.Format("<{0}>: {1}", nombre, mensaje));
               }
           }

           // Bloquea el subproceso.
           readThread.Join();

           // Cierra el puerto serie.
           Puerto_serie.Close();

       }

       // Lee mensaje recibido.
       public static void Leer()
       {
           // Si _continue es true se ejecuta todas las instrucciones dentro de while.
           while (_continua)
           {
               try
               {
                   // Almacena en la variable mensaje cualquier caracter o mensaje recibido.
                   string mensaje = Puerto_serie.ReadLine();

                   // Muestra en pantalla mensaje recibido.
                   Console.WriteLine(mensaje);
               }
               catch (TimeoutException) { }
           }
       }
   }
}


Otra cosa que me he sado cuenta. Si escribo o envío un mensaje que use la ñ, por ejemplo:
Hola Señor.
Me aparece esto.
Hola Se?or.
Siempre se me mete el ? por medio. Detecta mal los caracteres al recibir datos. Al introducirlos no.



Gracias.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Danielㅤ

Hola, si creo que es posible, pero debés aumentar ese valor desde la propia CMD, desde el código no se puede hacer nada, pero puede que desde la consola si.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Meta

Gracias Señor.

He podido al final leer los puertos series físicos y virtuales. Dejo el código nuevo abajo.

1.
¿Cuál es la mejor opción del formato hasta para escribir la ñ, tildes sin que aparezca caracter raro a la hora de enviar texto en forma de chat?

2
. ¿Cómo se hace encode UTF 8 a la hora de enviar  y recibir datos por el puerto serie?

3. A la hora de escribir mensajes, solo puedo escribir un máximo de 255 caracteres. ¿Cómo se puede escribir en la consola, más caracteres sin estar limitado solo a 255?

Código C#:
Código (csharp) [Seleccionar]
using System;
using System.IO;
using System.IO.Ports;
using System.Threading;

namespace Chat_consola_02
{
    class Program
    {
        static bool _continua;
        static SerialPort Puerto_serie;

        static void Main(string[] args)
        {
            string COM = "";
            string nombre;
            string mensaje;
            StringComparer comparaString = StringComparer.OrdinalIgnoreCase;
            Thread readThread = new Thread(Leer);

            // Título de la ventana.
            Console.Title = "Enviar datos al puerto serie";

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

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

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

            // Limpiar pantalla y dejarlo todo gris.
            Console.Clear();

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

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

            // Obtenga una lista de nombres de puertos serie.
            string[] ports = SerialPort.GetPortNames();

            Console.WriteLine("Se encontraron los siguientes puertos series:");

            // Muestre el nombre de cada puerto en la consola.
            foreach (string port in ports)
            {
                Console.WriteLine(port);
            }

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

            // Configuración del puerto serie.
            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; // 500 // Milisegundos.
            Puerto_serie.WriteTimeout = 500; // 500

            // Comprueba si puede abrir el puerto serie.
            try
            {
                Puerto_serie.Open(); // Abrir el puerto serie.
            }

            // En caso que diera algún error como que no encuentra el puerto seleccionado
            // muestra una excepción.
            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.
                Environment.Exit(1); // Salir de la aplicación.
            }

            _continua = true;
            readThread.Start();

            // Mostrar texto Nombre y se
            Console.Write("Nombre: ");

            // guarda en la variable nombre.
            nombre = Console.ReadLine();

            Console.WriteLine("Escriba salir para salir");

            while (_continua)
            {
                // Cualquier caracter recibido se guarda en la variable mensaje.
                mensaje = Console.ReadLine();

                // Compara salir con el mensaje salir si lo haz escrito igual.
                // ¿Escribiste la palabra salir?
                if (comparaString.Equals("salir", mensaje))
                {
                    // Sí. Entonces, pone esta variable _continue en false.
                    _continua = false;
                }
                // No. Entonces, envía por el puerto serie tu nick
                // y mensaje que haz escrito.
                else
                {
                    Puerto_serie.WriteLine(
                        String.Format("<{0}>: {1}", nombre, mensaje));
                }
            }

            // Bloquea el subproceso.
            readThread.Join();

            // Cierra el puerto serie.
            Puerto_serie.Close();
        }

        // Lee mensaje recibido.
        public static void Leer()
        {
            // Si _continue es true se ejecuta todas las instrucciones dentro de while.
            while (_continua)
            {
                try
                {
                    // Almacena en la variable mensaje cualquier caracter o mensaje recibido.
                    string mensaje = Puerto_serie.ReadLine();

                    // Muestra en pantalla mensaje recibido.
                    Console.WriteLine(mensaje);
                }
                catch (TimeoutException) { }
            }
        }
    }
}


Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Danielㅤ

#3
Lo de la letra ñ y acentos es problema de codificación y eso lo debes programar desde tu código para que acepte los acentos, debes usar la codificación UTF-8.

Otra forma posible de solucionar lo de los acentos, es copiar la salida de ellos desde la consola y pegarlo en tu código y luego hacer un replace, aunque yo solía hacer eso en mis códigos y funcionaban bien, pero es un poco complicado hacerlo si no se sabe como, pero yo lo hacía con un replace, de todas maneras lo mejor es cambiar la codificación en el código.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Meta

Parece ser que el UTF-8 le gusta más la gente al usarlo.

¿Cómo se maneja el UTF-8?
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Danielㅤ

No, no es que les guste más, sino que ese tipo de codificación acepta más caracteres.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

EdePC

Tengo entendido de que C# trabaja directamente con UTF-16 (UniCode), supongo que bastaría con poner la consola para que muestre en esa codificación también:

Código (csharp) [Seleccionar]
Console.OutputEncoding = Encoding.Unicode;

- De ser necesario también el:

Código (csharp) [Seleccionar]
Console.InputEncoding = Encoding.Unicode;

Meta

Por lo que he estado mirando en Internet, y como también quiero recibir y enviar mensajes a dispositivos, se recomienda que sea la lectura y escritura de mensajes con Byte[].

Por ejemplo:
Código (csharp) [Seleccionar]
Byte[] unBuffer = Encoding.ASCII.GetBytes("Texto o mensaje a enviar."); // 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.


Por pasos qu eno se como hacerlo.
1. Escribo en la consola un mensaje.
Será esto:
Código (csharp) [Seleccionar]
Byte[] variable = Console.ReadLine();

2. Cuando ya se almacena en la variable "variable" un texto, por ejemplo. Hola, mi muy distinguido amigo. Me imagino que así se envía el texto.
Código (csharp) [Seleccionar]
Byte[] unBuffer = Encoding.ASCII.GetBytes(variable);
Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length);


Cuando llegue a mi casa, hago pruebas y comento.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Serapis

En efecto, para manejar más de 255 caracteres, debes prescindir de los 'ReadLINE y WriteLINE, que como su nombre sugiere refieren a una sola línea.

Puedes crear arrays donde cada ítem del array fuere una línea. Usar directamente un array de bytes es igualmente válido, cuando se escribe al detectar los caracteres de salto de línea, los interpreta y sigue escribiendo...

Nota que algo WriteLine y ReadLine, suelen usarse para la interacción con el usuario, normalmente si se le pide algo al usuario suele bastar una línea (o en varias writeLine-s), pero la respuesta dle usuario suele limitarse a una sola línea, luego ReadLine es más que suficiente al caso.

Ahora la cuestión es... porqué perder tiempo con la consola para intentar sortear los límites prácticos de la consola cuando hay controles para hacer interfaces de usuario sin las limitaciones de la consola????????. Un chat acaso no será más cómodo en una ventana (form) con alguna caja de texto multilínea... pero en fin, cada uno pierde el tiempo como quiere.

Meta

El array creado es este po rponer un ejemplo.

Códigos C#
:

Código (csharp) [Seleccionar]
Byte[] miArray = Encoding.ASCII.GetBytes("Texto o mensaje a enviar.");

En fin, todavía no se como se hace lo de enviar más de 255 carácteres. ¿Hay ejemplos?

Cita de: Serapis en 14 Diciembre 2020, 01:58 AM
Ahora la cuestión es... porqué perder tiempo con la consola para intentar sortear los límites prácticos de la consola cuando hay controles para hacer interfaces de usuario sin las limitaciones de la consola????????. Un chat acaso no será más cómodo en una ventana (form) con alguna caja de texto multilínea... pero en fin, cada uno pierde el tiempo como quiere.

Por curiosidad, después haré el que tu dices con Windows Form y WPF. ;)
Cuestiones didácticas no hay problemas, ;)

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/