none
Leer datos del puerto serie y saber interpretar RRS feed

  • Pregunta

  • Hola:

    Ver manual del protocolo.

    Con Windows Form 4.7.2 o con el 4.8 del FrameWork .Net. Se trata de intentar leer comandos y enviarlos.

    Por ejemplo, cada comando diferente que puedes encontrar en dicho manual, recibe una respuesta diferente.

    Envías un comando llamado B</t>. B más retorno de carro.

    Llega respuesta que siempre empieza con # y acaba con /t. El programa debe detectar cada entrada recibida desde el puerto serie y saberlo interpretar, ahí está lo complicado. Porque son muchos comandos y respuestas a recibir.

    Saludos.


    http://electronica-pic.blogspot.com

    jueves, 3 de junio de 2021 7:17

Respuestas

  • Hola Metaconta

    Hice el algoritmo para traducir la primera parte, excepto la última letra S, que se divide en 6 octetos. 

    Decime si vamos bien.

    using System;
    
    namespace ConsoleAppSerialComInterpreter
    {
        class Program
        {
            static void Main(string[] args)
            {
                Interpreter("IOLBVTFHRCQ");
            }
    
            private static void Interpreter(string input)
            {
                Console.Title = "Consulta del estado actual";
                Console.Clear();
    
                // aquí se debe invocar el método del SerialPort 
                // que recibe el string input y devuelve output
                // que output será procesado y se imprimirán sus datos
                // suponiendo que input será "IOLVBTFHRCQS" y que
                // output será "I119.1O120.2L80B100V11.2T100F59.9H60.0R.3C50Q6.3"
                // + "S" + (bytes)<192><129><136><136><128><192>
                // Por esto te preguntaba qué te devuelve "S" (en string)
                // Suponiendo que en base al input pasado, output contendrá lo siguiente
    
                string output = "I119.1O120.2L80B100V11.2T100F59.9H60.0R.3C50Q6.3";
                output += "E";   // poner un límite al string para
                input += "E";    // procesarlo en el loop
    
                int nextLetter = 0;
                string strValue = "";
                for (int a = 0; input[a + 1] != 'E'; a++)
                {
                    nextLetter = output.IndexOf(input[a + 1]);
                    strValue = output.Substring(output.IndexOf(input[a]) + 1, nextLetter - output.IndexOf(input[a]) - 1);
                    if (strValue.IndexOf('.') > -1)
                    {
                        if (strValue[0] == '.')
                            strValue = strValue.Insert(0, "0");
                    }
                    switch (input[a])
                    {
                        case 'I':
                            Console.WriteLine("El voltaje de la energía de la utilidad es " + strValue + " voltios.");
                            break;
                        case 'O':
                            Console.WriteLine("El voltaje de la salida del UPS es " + strValue + " voltios.");
                            break;
                        case 'L':
                            Console.WriteLine("El nivel actual de carga del UPS es " + strValue + "%.");
                            break;
                        case 'B':
                            Console.WriteLine("El nivel de capacidad de la batería es " + strValue + "%.");
                            break;
                        case 'V':
                            Console.WriteLine("El voltaje de la batería es " + strValue + " voltios.");
                            break;
                        case 'T':
                            Console.WriteLine("La temperatura del gabinete del UPS es " + strValue + " °C.");
                            break;
                        case 'F':
                            Console.WriteLine("La frecuencia de la energía de la utilidad es " + strValue + " Hertcios.");
                            break;
                        case 'H':
                            Console.WriteLine("La frecuencia del UPS en la salida es " + strValue + " Hertcios.");
                            break;
                        case 'R':
                            double minutes = Convert.ToDouble(strValue);
                            int seconds = (int)(minutes * 60.0);
                            Console.WriteLine("El tiempo restante de la batería tiene " + (seconds/60).ToString() + " minutos, " + (seconds % 60).ToString() + " segundos.");
                            break;
                        case 'C':
                            Console.WriteLine("La carga completa de la batería todavía necesita " + strValue + " minutos.");
                            break;
                        case 'Q':
                            Console.WriteLine("La corriente de salida es " + strValue + " amperios.");
                            break;
                        default:
                            break;
                    }
                }
                Console.ReadLine();
            }
        }
    }
    

    No se todavía si las letras pueden ir juntas (hice como que si) y como viene la S en string.

    Espero tus novedades.

    Saludos

    Pablo


    • Propuesto como respuesta EricRRModerator jueves, 10 de junio de 2021 14:04
    • Marcado como respuesta EricRRModerator miércoles, 30 de junio de 2021 18:20
    domingo, 6 de junio de 2021 4:20

Todas las respuestas

  • Hola Metaconta,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    jueves, 3 de junio de 2021 13:58
    Moderador
  • Hola Metaconta 

    Estuve leyendo la 1ra parte "Consultar estado actual". Podrás pasarme lo que te devuelve S? Próximamente te paso el método que imprima esos valores. 

    Necesitas todo lo que está en el manual? O lo primero nada más?

    Las letras mayúsculas las envias por separado o puede ser juntas?

    Saludos

    Pablo

    sábado, 5 de junio de 2021 2:58
  • Hola Metaconta

    Hice el algoritmo para traducir la primera parte, excepto la última letra S, que se divide en 6 octetos. 

    Decime si vamos bien.

    using System;
    
    namespace ConsoleAppSerialComInterpreter
    {
        class Program
        {
            static void Main(string[] args)
            {
                Interpreter("IOLBVTFHRCQ");
            }
    
            private static void Interpreter(string input)
            {
                Console.Title = "Consulta del estado actual";
                Console.Clear();
    
                // aquí se debe invocar el método del SerialPort 
                // que recibe el string input y devuelve output
                // que output será procesado y se imprimirán sus datos
                // suponiendo que input será "IOLVBTFHRCQS" y que
                // output será "I119.1O120.2L80B100V11.2T100F59.9H60.0R.3C50Q6.3"
                // + "S" + (bytes)<192><129><136><136><128><192>
                // Por esto te preguntaba qué te devuelve "S" (en string)
                // Suponiendo que en base al input pasado, output contendrá lo siguiente
    
                string output = "I119.1O120.2L80B100V11.2T100F59.9H60.0R.3C50Q6.3";
                output += "E";   // poner un límite al string para
                input += "E";    // procesarlo en el loop
    
                int nextLetter = 0;
                string strValue = "";
                for (int a = 0; input[a + 1] != 'E'; a++)
                {
                    nextLetter = output.IndexOf(input[a + 1]);
                    strValue = output.Substring(output.IndexOf(input[a]) + 1, nextLetter - output.IndexOf(input[a]) - 1);
                    if (strValue.IndexOf('.') > -1)
                    {
                        if (strValue[0] == '.')
                            strValue = strValue.Insert(0, "0");
                    }
                    switch (input[a])
                    {
                        case 'I':
                            Console.WriteLine("El voltaje de la energía de la utilidad es " + strValue + " voltios.");
                            break;
                        case 'O':
                            Console.WriteLine("El voltaje de la salida del UPS es " + strValue + " voltios.");
                            break;
                        case 'L':
                            Console.WriteLine("El nivel actual de carga del UPS es " + strValue + "%.");
                            break;
                        case 'B':
                            Console.WriteLine("El nivel de capacidad de la batería es " + strValue + "%.");
                            break;
                        case 'V':
                            Console.WriteLine("El voltaje de la batería es " + strValue + " voltios.");
                            break;
                        case 'T':
                            Console.WriteLine("La temperatura del gabinete del UPS es " + strValue + " °C.");
                            break;
                        case 'F':
                            Console.WriteLine("La frecuencia de la energía de la utilidad es " + strValue + " Hertcios.");
                            break;
                        case 'H':
                            Console.WriteLine("La frecuencia del UPS en la salida es " + strValue + " Hertcios.");
                            break;
                        case 'R':
                            double minutes = Convert.ToDouble(strValue);
                            int seconds = (int)(minutes * 60.0);
                            Console.WriteLine("El tiempo restante de la batería tiene " + (seconds/60).ToString() + " minutos, " + (seconds % 60).ToString() + " segundos.");
                            break;
                        case 'C':
                            Console.WriteLine("La carga completa de la batería todavía necesita " + strValue + " minutos.");
                            break;
                        case 'Q':
                            Console.WriteLine("La corriente de salida es " + strValue + " amperios.");
                            break;
                        default:
                            break;
                    }
                }
                Console.ReadLine();
            }
        }
    }
    

    No se todavía si las letras pueden ir juntas (hice como que si) y como viene la S en string.

    Espero tus novedades.

    Saludos

    Pablo


    • Propuesto como respuesta EricRRModerator jueves, 10 de junio de 2021 14:04
    • Marcado como respuesta EricRRModerator miércoles, 30 de junio de 2021 18:20
    domingo, 6 de junio de 2021 4:20