|
211
|
Programación / .NET (C#, VB.NET, ASP) / Al recibir datos, se me comen las palabras o faltan caracteres
|
en: 30 Diciembre 2021, 06:11 am
|
Buenas: Al recibir datos por puerto serie, muchas veces se me come las palabras. ¿Hay alguna forma que no fallen las entradas de mensajes por puerto serie? Dejo el código fuente aquí. using System; using System.IO.Ports; using System.Text; using System.Threading; using System.Windows.Forms; namespace Velocímetro_Arduino_Puerto_serie_01 { public partial class Form1 : Form { // Utilizaremos un string como buffer de recepción. string recibidos; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto. try { comboBox_Puerto.DataSource = SerialPort.GetPortNames(); } catch { MessageBox.Show("No encuentra ningún puerto físico ni virtual.", "Aviso:", MessageBoxButtons.OK, MessageBoxIcon.Warning); } // // Añade puertos disponibles físicos y virtuales. serialPort1.PortName = comboBox_Puerto.Text.ToString(); } #region Funciones. void UsbConectado() { byte[] miBuffer = Encoding.ASCII.GetBytes("USB_CONECTADO"); serialPort1.Write(miBuffer, 0, miBuffer.Length); } void UsbDesconectado() { byte[] miBuffer = Encoding.ASCII.GetBytes("USB_DESCONECTADO"); serialPort1.Write(miBuffer, 0, miBuffer.Length); } // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable. protected override void WndProc(ref Message USB) { if (USB.Msg == 0x219) { comboBox_Puerto.DataSource = SerialPort.GetPortNames(); } // Detecta si hay cambios en el usb y si los hay los refleja. base.WndProc(ref USB); } // Procesar los datos recibidos en el buffer y extraer las tramas completas. void Actualizar(object sender, EventArgs e) { // Asignar el valor de la trama al label_Recibir_Km. label_Recibir_Km.Text = recibidos; switch (recibidos) { case "OK": byte[] miBuffer = Encoding.ASCII.GetBytes("Conectado. "); serialPort1.Write(miBuffer, 0, miBuffer.Length); label_Recibir_Km.Text = "Arduino conectado."; break; default: break; } // Limpiar. recibidos = ""; } #endregion #region Botones. private void button_Conectar_Click(object sender, EventArgs e) { try { serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente. serialPort1.Open(); // Abrir puerto. UsbConectado(); comboBox_Puerto.Enabled = false; comboBox_Baudios.Enabled = false; button_Conectar.Enabled = false; button_Desconectar.Enabled = true; button_Enviar.Enabled = true; } catch { MessageBox.Show("El puerto no existe.", "Aviso:", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void button_Desconectar_Click(object sender, EventArgs e) { UsbDesconectado(); serialPort1.Close(); // Cerrar puerto. comboBox_Puerto.Enabled = true; comboBox_Baudios.Enabled = true; button_Conectar.Enabled = true; button_Desconectar.Enabled = false; button_Enviar.Enabled = false; } private void button_Enviar_Click(object sender, EventArgs e) { byte[] miBuffer = Encoding.ASCII.GetBytes("KM" + textBox_Km.Text); serialPort1.Write(miBuffer, 0, miBuffer.Length); } #endregion // Al cerrar el formulario, cierra el puerto si está abierto. private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { // Al cerrar este programa, indica a Arduino cerrado. // Arduino sigue con su rutina al detectar CERRADO. byte[] miBuffer = Encoding.ASCII.GetBytes("C#_CERRADO"); serialPort1.Write(miBuffer, 0, miBuffer.Length); // Cerrar puerto. serialPort1.Close(); } catch (Exception error) { MessageBox.Show(error.Message, "Aviso:", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { // Acumula los caracteres recibidos a nuestro "buffer" string. recibidos += serialPort1.ReadExisting(); // Invocar o llamar al proceso de tramas. Invoke (new EventHandler (Actualizar )); } } }
|
|
|
212
|
Programación / .NET (C#, VB.NET, ASP) / MAnejar dispositivo por vía Web
|
en: 29 Diciembre 2021, 06:31 am
|
Hola:
Me descargué una aplicación para controlar un SAI/UPS de mi ordenador o PC, al instalarlo, veo que los datos se comunican por puerto RS232 o el propio USB. Ahora uso el RS232.
Veo que el SAI envía datos al PC y lo lee el programa que en realidad es una Web, por supuesto, tiene SERVICIOS activado, si no, no funciona.
Con esto quiero decir, que debo crear un servicio y una web para controlar datos al enviar y recibir.
Por ejemplo, si el SAI me envía al PC un dato por el puerto serie, en este caso:
"245 VAC de Entrada"
"230 VAC de Salida"
Esto automaticamente lo lee la Web.
También en la Web se le puede enviar comandos al puerto serie desde la Web, por ejemplo, un comando que me desactive el altavoz del SAI.
Pulso un botón, en el puerto serie envía este dato:
"MUTE_ZUMBADOR"
Y el SAI lo sabe.
Con Visual Studio Community 2022 y usando el lenguaje C#. ¿Cuál es la mejor plataforma para crear una Web y servicio?
¿O cuál proyecto inicio?
Quiero saber los pasos.
Saludos.
|
|
|
214
|
Programación / .NET (C#, VB.NET, ASP) / Re: ¿Cómo enviar más de 255 letras?
|
en: 28 Diciembre 2021, 23:41 pm
|
Muy buen planteamiento. Muchísimas gracias, ya me sirvió. Dejo el código completo por si alguien lo necesita. Funciona todo al 100 %, con tildes incluidos. using System; using System.IO; using System.Net; using System.Net.Mail; using System.Text; namespace Enviar_email_Consola_07 { internal class Program { static void Main(string[] args) { // Variables. string usuario, contraseña, destinatario, asunto, mensaje; const int MAXIMA_LONGITUD = 2048; #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 // Título del programa. Console.WriteLine("\t\t----------------------------------------"); Console.WriteLine("\t\t\tEnviar Correo Electrónico"); Console.WriteLine("\t\t----------------------------------------"); try { Console.WriteLine("\n"); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("\t\tTu correo electrónico: "); Console.ForegroundColor = ConsoleColor.Gray; usuario = Console.ReadLine(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("\t\tIntroducir contraseña: "); Console.ForegroundColor = ConsoleColor.Gray; contraseña = LeerPassword(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("\t\tDestinatario: "); Console.ForegroundColor = ConsoleColor.Gray; destinatario = Console.ReadLine(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("\t\tAsunto: "); Console.ForegroundColor = ConsoleColor.Gray; asunto = Console.ReadLine(); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("\t\tMensaje: "); Console.ForegroundColor = ConsoleColor.Gray; //mensaje = Console.ReadLine(); #region Enviar más de 255 caracteres. // Enviar mensaje de más de 255 caracteres. ################################ Stream inputStream = Console.OpenStandardInput(); byte[] buffer = new byte[MAXIMA_LONGITUD ]; int numerosBytesLeidos = inputStream.Read(buffer, 0, MAXIMA_LONGITUD); char[] chars = Console.InputEncoding.GetChars(buffer, 0, numerosBytesLeidos); mensaje = new string(chars ); // ######################################################################### #endregion Console.WriteLine(); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.Write("\t\tCantidad de texto introducido: "); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine(mensaje.Length); MailMessage correo = new MailMessage (usuario, destinatario, asunto, mensaje ); SmtpClient servidor = new SmtpClient ("smtp.gmail.com") { Port = 587 }; NetworkCredential credenciales = new NetworkCredential (usuario, contraseña ); servidor.Credentials = credenciales; servidor.EnableSsl = true; Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("\t\tEnviando correo..."); servidor.Send(correo); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\t\tCorreo enviado satisfactoriamente."); correo.Dispose(); Console.CursorVisible = false; Console.ReadKey(); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("ERROR: \n"); Console.WriteLine("\t\t" + ex.Message); Console.WriteLine(); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("\t\tNo se ha enviado el correo."); Console.ReadKey(); } } // A la hora de introducir la contraseña, se sustituye por asterístos (*) en pantalla. public static string LeerPassword() { ConsoleKeyInfo cki; StringBuilder sb = new StringBuilder (); int contador = 0; do { cki = Console.ReadKey(true); if (cki.Key != ConsoleKey.Enter) { sb.Append(cki.KeyChar); if (contador < 1) { Console.Write("*"); } contador++; } else { break; } } while (true); Console.WriteLine(); return sb.ToString(); } } }
Que tengan buen fin de lo que queda de año. 
|
|
|
217
|
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. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Codificación_UTF_8_01 { internal class Program { static void Main(string[] args) { #region Configuración ventana. // Título de la ventana. Console.Title = "Encoder UTF-8"; // Tamaño de la ventana, x, y. Console.SetWindowSize(80, 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; #endregion // Cree una codificación UTF-8. UTF8Encoding utf8 = new UTF8Encoding (); // Una cadena Unicode con dos caracteres fuera de un rango de código de 8 bits. String unicodeString = "Esta cadena Unicode tiene 2 caracteres fuera del " + "rango ASCII:\n" + "Pi (\u03a0), y Sigma (\u03a3)."; Console.WriteLine("Cadena original:"); Console.WriteLine(unicodeString); // Codifica la cadena. Byte[] encodedBytes = utf8.GetBytes(unicodeString); Console.WriteLine(); Console.WriteLine("Bytes codificados:"); for (int ctr = 0; ctr < encodedBytes.Length; ctr++) { Console.Write("{0:X2} ", encodedBytes[ctr]); if ((ctr + 1) % 25 == 0) Console.WriteLine(); } Console.WriteLine(); // Decodifica bytes de nuevo a cadena. String decodedString = utf8.GetString(encodedBytes); Console.WriteLine(); Console.WriteLine("Bytes decodificados:"); Console.WriteLine(decodedString); // Pulse cualquier tecla para salir. Console.ReadKey(); } } }
Dejo aquí la captura.  Ni copiando el propio código de MicroSoft funciona. Saludos.
|
|
|
218
|
Programación / .NET (C#, VB.NET, ASP) / Re: Ayuda como integrar *.py en C#
|
en: 26 Diciembre 2021, 14:56 pm
|
Hola: Así sin más nunca lo he hecho. Lo que he hecho y hice un documento, es crear una dll de C++ nativo y que lo lea C#. O lo que es lo mismo de lo que quieres hacer. Crear una dll hecho con Python y lo lea C#. Revisa el documento si es así lo que deseas. En este ejemmplo es mostrar un texto y una suma cuya funciones está en C++ con una dll y C# lo llama para mostrar los datos. También se puede crear controles visuales. Es así lo más parecido que te puedo ayudar. Saludos.
|
|
|
219
|
Programación / .NET (C#, VB.NET, ASP) / Re: Comunicación SerialPort concurrente
|
en: 26 Diciembre 2021, 04:31 am
|
Felices fiestas.  ¿Tienes claro que comandos envias y qué esperas recibir de él? Puedes hacer una mini lista sobre comandos aquí para poder hacer ejemplos. Si usas el Windows Form, añades un botón en el formulario, hablando en C# para este ejemplo, para enviar comandos es así. private void button_Activar_Click(object sender, EventArgs e) { byte[] mBuffer = Encoding.ASCII.GetBytes("EncenderLed"); // Comando a enviar. serialPort1.Write(mBuffer, 0, mBuffer.Length); }
Al recibir datos es así. // Al recibir datos. private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { // Acumula los caracteres recibidos a nuestro 'buffer' (string). recibidos += serialPort1.ReadExisting(); // Invocar o llamar al proceso de tramas. Invoke (new EventHandler (Actualizar )); }
No olvidar que cada comando recibido, debes vaciar la variable para que no se concatenen, que luego no funciona. // Limpiar. recibidos = "";
Ya nos contarás más información sobre ello. Que dispositivos es y si te sabes realmente los comandos y respuestas a enviar o lo haces tuyo propio o viene en documentación del dispositivo. Saludos. 
|
|
|
220
|
Programación / .NET (C#, VB.NET, ASP) / Re: C# Ejecutar archivo .bat
|
en: 26 Diciembre 2021, 04:02 am
|
Buenas y felices fiestas 2021. En este código de abajo, añades el programa CMD.exe y luego el comando como apagar el PC o ordenador en 60 segundos. ProcessStartInfo info = new ProcessStartInfo ("cmd", "c/ shutdown -s -t 60");
En el Windows Form con Visual Studio Community 2022 gratuito. Añades dos botones. Este es su código completo para que te hagas una idea, se incluye más código para que no muestre la ventana del cmd a la hora de ejecutarlo. using System; using System.Diagnostics; using System.Windows.Forms; namespace Apagar_PC_con_botones_y_cancelar_01 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button_Apagar_Click(object sender, EventArgs e) { ProcessStartInfo info = new ProcessStartInfo ("cmd", "c/ shutdown -s -t 60"); info.UseShellExecute = false; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(info); } private void button_Cancelar_Click(object sender, EventArgs e) { ProcessStartInfo info = new ProcessStartInfo ("cmd", "c/ shutdown -a"); info.UseShellExecute = false; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(info); } } }
¿Es lo qué buscas? Saludos.
|
|
|
|
|
|
|