Mi idea es quien sabe de la mejor LCD aunque sea grande para hacer buenos textos ahí, con tildes incluido.
Aquí les dejo por ahora código de C# y VB .net, más adelante el C++ CLR .net.
Para compilar y usar este programa, usar Visual Studio Community 2022 gratuito y en español.
Código C#:
using System;
using System.IO;
using System.IO.Ports;
using System.Text;
using System.Threading;
namespace Chat_Consola_04
{
class Program
{
static bool _continua;
static SerialPort Puerto_serie;
static void Main(string[] args)
{
const int MAXIMA_LONGITUD = 40000;
string COM = "";
string nombre;
string mensaje;
string titulo = "Mini chat C#";
StringComparer comparaString = StringComparer.OrdinalIgnoreCase;
Thread readThread = new Thread(Leer);
#region Configuración ventana.
// Título de la ventana.
Console.Title = titulo;
// Tamaño de la ventana, x, y, o ancho y alto.
const byte ANCHO_X = 70, ALTO_Y = 25;
Console.SetWindowSize(ANCHO_X, ALTO_Y);
// Color de fondo.
Console.BackgroundColor = ConsoleColor.Green;
// Color de las letras.
Console.ForegroundColor = ConsoleColor.Black;
// Limpiar pantalla y dejarlo todo en color de fondo.
Console.Clear();
// Visible el cursor.
Console.CursorVisible = true;
#endregion
#region Configuración puerto serie.
// Crear un nuevo objeto SerialPort con la configuración predeterminada.
Puerto_serie = new SerialPort();
// Codificar a UTF-8 para que se vean bien las tildes, ñ y otros caracteres.
Puerto_serie.Encoding = Encoding.UTF8;
// Obtenga una lista de nombres de puertos serie.
string[] puertos = SerialPort.GetPortNames();
Console.WriteLine("Se encontraron los siguientes puertos series:");
// Muestre el nombre de cada puerto en la consola.
foreach (string puerto in puertos)
{
Console.WriteLine(puerto);
}
// 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(); // Limpiar pantalla.
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.
}
// Se ha denegado el acceso al puerto.
catch (UnauthorizedAccessException)
{
Console.ForegroundColor = ConsoleColor.Red; // Texto en rojo.
Console.CursorVisible = false;
Console.SetCursorPosition(16, 6);
Console.WriteLine(@"Se ha denegado el acceso al puerto " + Puerto_serie.PortName +
"" +
"\nPuede estar el puerto escogido en uso.\n" +
"Elija un puerto diferente o desactiva el que está en uso.");
Console.ReadKey(); // Pulse cualquier tecla.
Environment.Exit(1); // Salir de la aplicación.
}
#endregion
_continua = true;
readThread.Start();
// Mostrar texto Nombre y se
Console.Write("Nombre: ");
// guarda en la variable nombre.
nombre = Console.ReadLine();
// Se muestra el nombre o nick y el puerto seleccionado al final del título de la ventana.
Console.Title = titulo + "- Nick: " + nombre + " - COM: " + COM;
Console.WriteLine("Escriba /salir para salir.");
while (_continua)
{
// Cualquier caracter recibido se guarda en la variable mensaje.
//mensaje = Console.ReadLine();
#region Enviar más de 255 caracteres.
// #########################################################################
Stream entradaDeDatos = Console.OpenStandardInput();
byte[] buffer = new byte[MAXIMA_LONGITUD];
int numerosBytesLeidos = entradaDeDatos.Read(buffer, 0, MAXIMA_LONGITUD);
char[] chars = Console.InputEncoding.GetChars(buffer, 0, numerosBytesLeidos);
mensaje = new string(chars);
// #########################################################################
#endregion
// Compara /salir con el mensaje /salir si lo haz escrito igual.
// ¿Escribiste la palabra /salir?
if (comparaString.Equals("/salir\r\n", 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 _continua 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) { }
}
}
}
}
Código Visual Basic .net:
Imports System.IO
Imports System.IO.Ports
Imports System.Text
Imports System.Threading
Module Module1
Dim _continua As Boolean
Dim Puerto_serie As SerialPort
Sub Main()
Const MAXIMA_LONGITUD = 40000
Dim COM = ""
Dim nombre As String
Dim mensaje As String
Dim titulo = "Mini chat VB .net"
Dim comparaString = StringComparer.OrdinalIgnoreCase
Dim readThread As Thread = New Thread(AddressOf Leer)
#Region "Configuración ventana."
' Título de la ventana.
Console.Title = titulo
' Tamaño de la ventana, x, y, o ancho y alto.
Const ANCHO_X As Byte = 70, ALTO_Y As Byte = 25
Console.SetWindowSize(ANCHO_X, ALTO_Y)
' Color de fondo.
Console.BackgroundColor = ConsoleColor.Blue
' Color de las letras.
Console.ForegroundColor = ConsoleColor.White
' Limpiar pantalla y dejarlo todo en color de fondo.
Console.Clear()
' Visible el cursor.
Console.CursorVisible = True
#End Region
#Region "Configuración puerto serie."
' Crear un nuevo objeto SerialPort con la configuración predeterminada.
Puerto_serie = New SerialPort()
' Codificar a UTF-8 para que se vean bien las tildes, ñ y otros caracteres.
Puerto_serie.Encoding = Encoding.UTF8
' Obtenga una lista de nombres de puertos serie.
Dim puertos As String() = SerialPort.GetPortNames()
Console.WriteLine("Se encontraron los siguientes puertos series:")
' Muestre el nombre de cada puerto en la consola.
For Each puerto In puertos
Console.WriteLine(puerto)
Next
' 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() ' Limpiar pantalla.
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 __unusedIOException1__ As 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.
' Se ha denegado el acceso al puerto.
Catch __unusedUnauthorizedAccessException2__ As UnauthorizedAccessException
Console.ForegroundColor = ConsoleColor.Red ' Texto en rojo.
Console.CursorVisible = False
Console.SetCursorPosition(16, 6)
Console.WriteLine("Se ha denegado el acceso al puerto " & Puerto_serie.PortName & "" & vbLf & "Puede estar el puerto escogido en uso." & vbLf & "Elija un puerto diferente o desactiva el que está en uso.")
Console.ReadKey() ' Pulse cualquier tecla.
Environment.Exit(1) ' Salir de la aplicación.
End Try
#End Region
_continua = True
readThread.Start()
' Mostrar texto Nombre y se
Console.Write("Nombre: ")
' guarda en la variable nombre.
nombre = Console.ReadLine()
' Se muestra el nombre o nick y el puerto seleccionado al final del título de la ventana.
Console.Title = titulo & "- Nick: " + nombre & " - COM: " + COM
Console.WriteLine("Escriba /salir para salir.")
While _continua
' Cualquier caracter recibido se guarda en la variable mensaje.
'mensaje = Console.ReadLine();
#Region "Enviar más de 255 caracteres."
' #########################################################################
Dim entradaDeDatos As Stream = Console.OpenStandardInput()
Dim buffer = New Byte(MAXIMA_LONGITUD - 1) {}
Dim numerosBytesLeidos = entradaDeDatos.Read(buffer, 0, MAXIMA_LONGITUD)
Dim chars As Char() = Console.InputEncoding.GetChars(buffer, 0, numerosBytesLeidos)
mensaje = New String(chars)
' #########################################################################
#End Region
' Compara /salir con el mensaje /salir si lo haz escrito igual.
' ¿Escribiste la palabra /salir?
If comparaString.Equals("/salir" & vbCrLf, mensaje) Then
' Sí. Entonces, pone esta variable _continue en false.
' No. Entonces, envía por el puerto serie tu nick
' y mensaje que haz escrito.
_continua = False
Else
Puerto_serie.WriteLine(String.Format("<{0}>: {1}", nombre, mensaje))
End If
End While
' Bloquea el subproceso.
readThread.Join()
' Cierra el puerto serie.
Puerto_serie.Close()
End Sub
' Lee mensaje recibido.
Public Sub Leer()
' Si _continua es true se ejecuta todas las instrucciones dentro de while.
While _continua
Try
' Almacena en la variable mensaje cualquier caracter o mensaje recibido.
Dim mensaje As String = Puerto_serie.ReadLine()
' Muestra en pantalla mensaje recibido.
Console.WriteLine(mensaje)
Catch __unusedTimeoutException1__ As TimeoutException
End Try
End While
End Sub
End Module
Continuará...