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
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delimitador_consola_03 { class Program { static void Main(string[] args) { #region Configuración ventana. // Título de la ventana. Console.Title = "Probando manipulación de cadena"; // 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; #endregion // Cree una codificación ISO-8859-1. Encoding ISO_8859_1 = Encoding.GetEncoding("ISO-8859-1"); #region Variables. // Partir a trocitos estos caracteres. char[] delimitadorComandoB = { '#', ',', 'O', 'I', 'L', 'B', 'V', 'F', 'H', 'R', 'S', }; // Es la cadena de caracteres que me llegó desde el puerto serie. // En este ejemplo lo dejo en la varible directamente. // Una cadena completa empieza con # y termina en <cr>, o lo que es lo mismo, /r. string respuestaB = "#I223.3O224.0L000B100V26.4F50.2H50.2R0080S„€€„À"; // Comando B. // Se guarga en este array tipo string los datos ya partidos a tozos. string[] palabrasB = respuestaB.Split(delimitadorComandoB); // Tabla S1 descripción. string[] DESCRIPCION_S1 = { "Indica que este byte está disponible y es válido. [Siempre 1]", // Posición [0]. "Indica falla de energía de la red pública; ver detalles en S2.0 y S2.1.", "Indica que la capacidad de la batería es menor que el umbral de apagado.", "Indica que el zumbador está en estado de pitido.", "Indica que la prueba de batería se está procesando.", "Indica que el apagado programado está pendiente.", "Indica que la restauración programada está pendiente.", "Indica falla de hardware; ver detalles sobre el comando X71." // Posición [7]. }; string[] DESCRIPCION_S2 = { "Para indicar que este byte está disponible y es válido. [Siempre 1].", "--", "XX", "Indica sobretemperatura del inversor.", "Indica que el inversor tiene una falla.", "Indica que el inversor está apagado.", "Indica que la frecuencia de la utilidad está fuera de rango.", "Indica que el voltaje de la red pública está fuera de rango." }; string[] DESCRIPCION_S3 = { "Para indicar que este byte está disponible y es válido. [Siempre 1].", "Indica que la batería está completamente cargada.", "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.", "Indica que la batería se está cargando.", "Indica que la batería se está descargando.", "Indica que la capacidad de la batería es inferior al 80 por ciento.", "Reservado, debe ser 0.", "Indica que la batería no está presente." }; string[] DESCRIPCION_S4 = { "Para indicar que este byte está disponible y es válido. [Siempre 1].", "Indica que el bypass es una sobrecarga.", "Indica que la derivación está activa.", "Indica que la salida sufre un cortocircuito.", "Indica que la salida tiene carga.", "Indica que la salida está sobrecargada.", "Indica que la frecuencia de salida está fuera de rango en bypass.", "Indica que el voltaje de salida está fuera de rango en derivación." }; string[] DESCRIPCION_S5 = { "Para indicar que este byte está disponible y es válido. [Siempre 1].", "Indica que no hay salida.", "Para indicar que el tiempo de ejecución restante es inferior al umbral.", "Para indicar que el zumbador está silenciado (no permanente) en este momento.", "Para indicar falla de cableado.", "Para indicar SAI en modo ECO.", "Para indicar UPS en Bypass manual.", "Arreglar 0." }; string[] DESCRIPCION_S6 = { "Para indicar que este byte está disponible y es válido. [Siempre 1].", "Indica UPS encendido.", "Reservado, debe ser 0.", "Reservado, debe ser 0.", "Reservado, debe ser 0.", "Reservado, debe ser 0.", "Reservado, debe ser 0.", "Reservado, debe ser 0." }; bool boolS1 = true; bool boolS2 = false; bool boolS3 = false; bool boolS4 = false; bool boolS5 = false; bool boolS6 = false; bool boolContador = true; bool boolContador2 = false; #endregion // Comando B. Console.WriteLine(); // Muestra los resultados en pantalla. Console.WriteLine(); Console.WriteLine("El voltaje de la utilidad es de {0} voltios. ", palabrasB[2]); // I. Console.WriteLine("El voltaje de salida del UPS es de {0} voltios. ", palabrasB[3]); // O. Console.WriteLine("La carga actual de UPS es del {0} por ciento. ", palabrasB[4]); // L. Console.WriteLine("La capacidad de la batería es del {0} por ciento. ", palabrasB[5]); // B. Console.WriteLine("El voltaje de la batería es de {0} voltios. ", palabrasB[6]); // V. //Console.WriteLine("La temperatura del gabinete del UPS es de {0} grados centígrados. ", palabrasB[7]); // T. No hay T. en mi versión. Console.WriteLine("La frecuencia de salida del SAI es de {0} Hz. ", palabrasB[7]); // F. Console.WriteLine("La frecuencia de salida del SAI es de {0} Hz. ", palabrasB[8]); // H. Console.WriteLine("El tiempo de funcionamiento restante de la batería es de {0} minutos. ", palabrasB[9]); //Console.WriteLine(@"Estos son los bits de estados que no se entiende.S: //Aquí hay que leer cada bits como cuando se leyeron cada Byte arriba: ", (char)palabrasB[10]); char[] bits = palabrasB[10].ToCharArray(); //int byteS1 = (byte)bits[0]; //int byteS2 = (byte)bits[1]; //int byteS3 = (byte)bits[2]; //int byteS4 = (byte)bits[3]; //int byteS5 = (byte)bits[4]; //int byteS6 = (byte)bits[5]; //Console.WriteLine("Byte S1: {0}", byteS1.ToString()); //Console.WriteLine("Byte S2: {0}", byteS2.ToString()); //Console.WriteLine("Byte S3: {0}", byteS3.ToString()); //Console.WriteLine("Byte S4: {0}", byteS4.ToString()); //Console.WriteLine("Byte S5: {0}", byteS5.ToString()); //Console.WriteLine("Byte S6: {0}", byteS6.ToString()); //Console.WriteLine(); //Console.WriteLine(((byteS1 & 128) == 128) ? "ACTIVADO" : "DESACTIVADO"); //Console.WriteLine(((byteS1 & 128) == 128) ? "1" : "0"); //Console.WriteLine(); Tabla(); int contador = 0; for (int b = 0; b < bits.Length; b++) { for (int a = 7; a >= 0; a--) { Console.Write((((byte)bits[b]) & (1 << a)) >> a); Console.Write(" | "); if ((contador <= 7) && (boolS1 == true)) { Console.WriteLine(DESCRIPCION_S1[contador]); if (contador == 7) { boolS1 = false; boolS2 = true; boolContador2 = true; contador = 0; } } else if ((contador <= 7) && (boolS2 == true)) { Console.WriteLine(DESCRIPCION_S2[contador]); boolContador2 = false; if (contador == 7) { boolS2 = false; boolS3 = true; boolContador2 = true; contador = 0; } } else if ((contador <= 7) && (boolS3 == true)) { Console.WriteLine(DESCRIPCION_S3[contador]); boolContador2 = false; if (contador == 7) { boolS3 = false; boolS4 = true; boolContador2 = true; contador = 0; } } else if ((contador <= 7) && (boolS4 == true)) { Console.WriteLine(DESCRIPCION_S4[contador]); boolContador2 = false; if (contador == 7) { boolS4 = false; boolS5 = true; boolContador2 = true; contador = 0; } } else if ((contador <= 7) && (boolS5 == true)) { Console.WriteLine(DESCRIPCION_S5[contador]); boolContador2 = false; if (contador == 7) { boolS5 = false; boolS6 = true; boolContador2 = true; contador = 0; } } else if ((contador <= 7) && (boolS6 == true)) { Console.WriteLine(DESCRIPCION_S6[contador]); boolContador2 = false; if (contador == 7) { boolS6 = true; boolContador2 = true; contador = 0; } } if (boolContador == true) { contador++; if (boolContador2 == true) { contador = 0; } } //Console.WriteLine(); } Console.WriteLine(); } #region Tabla. void Tabla() { Console.WriteLine(); Console.WriteLine("Byte | Bit | Estado | Descripción"); Console.WriteLine("-----+-----+-----------------------------------------------------------------------"); } #endregion // Pulse cualquier tecla para salir. Console.ReadKey(); } } }
¿Cómo se soluciona este problema?
Saludos.