¿Guardar datos fijos en variables constantes, enumeraciones o en otro sitio?

Iniciado por Meta, 30 Diciembre 2015, 11:49 AM

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

Meta

Hola:

Quiero saber cual es la forma de guardar datos fijos de un byte y otros de varios bytes. Estos datos son enviados al puerto serie. No se envían todos al mismo tiempo, sino cuando de la orden cuando quiera.

Por ejemplo, tengo datos guardados en enumeraciones como puedes ver abajo.

       
Código (csharp) [Seleccionar]
enum DexCommands { INIT = 0x00, STATUS = 0x01, READ = 0x02, WRITE = 0x04, LIGHT = 0x07, MAGIC_HANDSHAKE = 0x27 };



También se puede almacenar de esta forma en varibales const.

Código (csharp) [Seleccionar]
        const byte INIT = 0x00;
        const byte STATUS = 0x01;
        const byte READ = 0x02;
        const byte SEEK = 0x03;
        const byte WRITE = 0x04;
        const byte PAGE = 0x05;
        const byte LIGHT = 0x07;
        const byte MAGIC_HANDSHAKE = 0x27;


Otro ejemplo para tratar de byte para enviar por el puerto serie.

Código (csharp) [Seleccionar]
        byte[] INIT = { 0x00 };
        byte[] STATUS = { 0x01 };
        byte[] READ = { 0x02 };
        byte[] SEEK = { 0x03 };
        byte[] WRITE = { 0x04 };
        byte[] PAGE = { 0x05 };
        byte[] LIGHT = { 0x07 };
        byte[] MAGIC_HANDSHAKE = { 0x27 };



1. Quiero saber cuál forma es mejor y por qué.

Si quiero enviar el byte STATUS que es 0x01 puedo hacerlo así, si no estoy equivocado. Eso si, llamándole directamente 0x01.

Código (csharp) [Seleccionar]
byte[] mBuffer = new byte[1];
    mBuffer[0] = 0x01;
    serialPort1.Write(mBuffer, 0, mBuffer.Length);


Ya que lo tengo guardado en enum, lo llamaré así:

Código (csharp) [Seleccionar]
            serialPort1.Open(); // Abrir puerto.
            serialPort1.Write((byte)Dex_Comandos.STATUS);
            serialPort1.Close(); // Cerrar puerto.


2. Este código no funciona. ¿Cómo es la mejor manera para usar datos, variables o enumeraciones en este caso?

Teniendo esta trama de byte de forma fija, por ejemmplo, quiero mandar el comandos STATUS que es de un solo byte por el puerto serie. ¿Cómo lo hago?

3. Tengo esta trama de byte abajo. ¿Cómo puedo enviarla?

       
Código (csharp) [Seleccionar]
byte[] TRAMAS = { 0x10, 0x29, 0x23, 0xbe, 0x84, 0xe1, 0x6c, 0xd6, 0xae, 0x52, 0x90, 0x49, 0xf1, 0xf1, 0xbb, 0xe9, 0xeb };

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

Eleкtro

En C#, "0x" es el conjunto de caracteres reservados para representar, en tiempo de diseño, valores hexadecimales literales. (en Vb.Net sería "&H")




El valor hexadecimal 0x1 equivale a 1 en decimal, así que a tu duda: si, en el ejemplo que has mostrado estás usando el mismo valor.




Respecto a utilizar enumeraciones o constantes, no hay una respuesta facil, es más bien una cuestión de diseño que de beneficios, aunque se puede compaginar diseño y beneficios, y el uso de constantes y enumeraciones, todo depende de lo que quieras y los resultados visuales que quieras obtener...

Por ejemplo si desarrollas un método cuyo parámetro espera recibir un valor de entre una serie de valores constantes, entonces ahí deberías implementar la Enum para definir esos valores, de esta forma estás encapsulando la información en un único miembro o unidad de código, beneficiando así a la estructura/organización y legibilidad del código, y sobre todo ganando productividad para ti y para los posibles usuarios de tus APIs, ya que siempre será mucho más amistoso y preciso escribir el nombre de una Enum, que tener que memorizar el nombre de cada constante por separado.

Otro beneficio de una Enum es que el valor lo puedes representar como un valor numérico, o como texto (el nombre del valor).

Adicionalmente a los beneficios "de fábrica" de una Enum, el máximo beneficio tal vez sea poder utilizar el atributo FlagsAttribute para combinar valores y añadir así una mejora tanto estética como "interna", me refiero a que aumentaría la productividad y eficiencia del código fuente en general con los miembros dedicados a este tipo de Enums (ej. Enum.HasFlag), lo que ayuda a ver de una forma distinta el tratamiento de condicionales/switchs sobre Enums;
, aunque para ello primero se deben dar las circunstancias adecuadas en los valores que componen a la Enum, y eso en tu código no es posible.

Personalmente no encuentro ninguna desventaja en reemplazar una constante por una enumeración, el código que has mostrado es apto para implementar una Enum.

Si tuvieras solo un par de valores, y si dichos valores no tuviesen relación entre si, entonces si que te diría que lo mejor sería declarar constantes, pero no es el caso.

De todas formas hazlo como prefieras, al fin y al cabo el resultado que vas a obtener es el mismo, usar Enums o constantes solo cambiará la experiencia de programación sobre el entorno.




Cita de: Meta en 30 Diciembre 2015, 11:49 AM
Código (csharp) [Seleccionar]
byte[] mBuffer = new byte[1];
mBuffer[0] = 0x01;
serialPort1.Write(mBuffer, 0, mBuffer.Length);


Código (csharp) [Seleccionar]
serialPort1.Write((byte)Dex_Comandos.STATUS);

Este código no funciona.

En el primer código usas un array de bytes, pero en el segundo usas un valor byte. La diferencia es muy clara.

Podría mostrarte un ejemplo, pero es demasiado facil, solo debes fijarte mejor en lo que estás haciendo, lo puedes solucionar por ti mismo perfectamente.

El valor lo tienes en Dex_Comandos.STATUS, pues simplemente asigna ese valor al primer item con índice "0" del Array como haces en el primer código.

PD:
Ten en cuenta que puedes declarar los valores de la Enum como tipo Byte.

Código (csharp) [Seleccionar]
public enum MyEnum : byte
{
name = 1
}


Saludos








Meta

Muy buena la explicación paso a paso. Excelente documentación.
Buen trabajo.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Meta

Hola:

Si en el valor STATUS tiene estos valores en ASCII como en este caso llamado Hola.

Mejor pasar los 4 bytes en hex. ¿Se puede guardar en el enum esos 4 bytes en STATUS?

¿Cuál es la mejor fomra de hacerlo si existe la posibilidad?

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