elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Leer bits de Byte
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Leer bits de Byte  (Leído 134 veces)
Meta


Desconectado Desconectado

Mensajes: 3.263



Ver Perfil WWW
Leer bits de Byte
« en: 2 Abril 2021, 13:14 pm »

Buenas camaradas:

Haciendo un programa hecho con Windows Form bajo .Net FrameWotk 4.7. Si envío un comando por el puerto serie que se llama X82, recibo un mensaje que en ASCII no se entiende porque usa caracteres raros.

Lo paso a hexadecimal y en binario.

Envío un comando, ocurre algún evento y en Windoes Form me aparece cógios en HEX y en BIN. Se puede cambiar varios bit en un único Byte.

Por ejemplo, si me llega este dato.

Hexadecimal: 23C797C0B00D

Binario: 00100011 11000111 10010111 11000000 10110000 00001101

Un ejemplo, es poner muchos labels en cada bits y una tabla de cada Byte recibido. Simpre son la misma cantidad de bytes ya que en realdiad hace de Flags.

Centrándonos en el binario, ya que hay 6 Bytes.

Código
  1. 00100011 11000111 10010111 11000000 10110000 00001101
  2. -------- -------- -------- -------- -------- --------
  3. Byte I  Byte a    Byte b   Byte c   Byte d   Byte F
  4.  

En el Byte c que corresponde al 11000000 quiero leer el bit 3 que corresponde al "Extractor" indicado en la tabla de abajo. Cada Byte tiene su tabla, ahora nos centramos en un Byte y ver los estados de los bits.

bit:c Dato        Función.
7 =   1            Motor A.
6 =   1            Motor B.
5 =   0            Luz A.
4 =   0            Luz B.
3 =   0            Extractor.
2 =   0            Alarma.
1 =   0            Persiana.
0 =   0            Ventilador

El Byte c que ahora contiene estos bits que son 11000000, me llega una nueva trama de Bytes y precisamente este, cambia de 11000000 a 11001000. Solo ha cambiado un bit que es el 3 en el Byte c.

Cada bit tiene su label para mostrarlo en el formulario de Windows. La tabla de abajo se actualiza.

bit:c Dato        Función.
7 =   1            Motor A.
6 =   1            Motor B.
5 =   0            Luz A.
4 =   0            Luz B.
3 =   1            Extractor.
2 =   0            Alarma.
1 =   0            Persiana.
0 =   0            Ventilador

Antes el Byte c del bit 3 que es el Extractor estaba a 0, ahora es 1.

En resumen. Quiero saber como se leen los bits que me llegan del puerto serie.

¿Existe la posibilidad de hacer un programa así?

Saludos.

PD: En esta clase de programas que no suelo usar, es como las aves, fáciles de ver, difíciles de alcanzar.


En línea

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


Desconectado Desconectado

Mensajes: 576


Crianosfera 5 in comming!!!


Ver Perfil
Re: Leer bits de Byte
« Respuesta #1 en: 2 Abril 2021, 15:59 pm »

En resumen. Quiero saber como se leen los bits que me llegan del puerto serie.

No lo puedo probar en C# porque no tengo la PC con Windows, sin embargo lo siguiente fue probado en C++ y debería ser igual en C#:

Código
  1. bool LeerBit(Byte elByte, Byte elBit)
  2. {
  3. return (elByte & (1 << elBit)) != 0;
  4. }

Un código de ejemplo:
Código
  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. typedef unsigned char Byte;
  5.  
  6. enum
  7. {
  8. EST_VENTILADOR,
  9. EST_PERSIANA,
  10. EST_ALARMA,
  11. EST_EXTRACTOR,
  12. EST_LUZ_B,
  13. EST_LUZ_A,
  14. EST_MOTOR_B,
  15. EST_MOTOR_A,
  16.  
  17. EST_TODOS_LOS_CONTROLADORES,
  18. };
  19.  
  20. bool LeerBit(Byte elByte, Byte elBit)
  21. {
  22. return (elByte & (1 << elBit)) != 0;
  23. }
  24.  
  25. int main(int argc, char* argv[])
  26. {
  27. Byte unEstado=0b11001000;
  28.  
  29. for(Byte i = 0; i < EST_TODOS_LOS_CONTROLADORES; i++)
  30. {
  31. printf("El bit: %i tiene valor %s\n", i, (LeerBit(unEstado, i)? "Activo" : "Inactivo"));
  32. }
  33. std::cin.ignore();
  34. return 0;
  35. }
  36.  

Una imagen del resultado:


B#


En línea



Meta


Desconectado Desconectado

Mensajes: 3.263



Ver Perfil WWW
Re: Leer bits de Byte
« Respuesta #2 en: 2 Abril 2021, 19:46 pm »

Buen truco en C++.

Me funcionó en modo consola en Windows.

Ver imagen.

Código
  1. #include <iostream>
  2. #include <windows.h> // Para mostrar texto en el título de la ventana.
  3. #include <stdio.h>   // Cambio color de fondo y letras.
  4.  
  5. using namespace std;
  6. //using std::cout;
  7. //using std::cin;
  8.  
  9. typedef unsigned char Byte;
  10.  
  11. enum
  12. {
  13. EST_VENTILADOR,
  14. EST_PERSIANA,
  15. EST_ALARMA,
  16. EST_EXTRACTOR,
  17. EST_LUZ_B,
  18. EST_LUZ_A,
  19. EST_MOTOR_B,
  20. EST_MOTOR_A,
  21.  
  22. EST_TODOS_LOS_CONTROLADORES,
  23. };
  24.  
  25. bool LeerBit(Byte elByte, Byte elBit)
  26. {
  27. return (elByte & (1 << elBit)) != 0;
  28. }
  29.  
  30. int main(int argc, char* argv[])
  31. {
  32. // Mostrar caracteres correctamente en pantalla y título de la ventana.
  33. SetConsoleOutputCP(65001);
  34. wchar_t titulo[128];
  35. MultiByteToWideChar(CP_UTF8, 0, "Título de la ventana. Win32 C++ 2019.", -1, titulo, 128);
  36. SetConsoleTitle(titulo);
  37.  
  38. // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
  39. SMALL_RECT r = { 0, 0, 49, 9 }; // X = 49, Y = 9.
  40. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
  41.  
  42. // Cambio color de A (verde claro), color letras 0 (negro).
  43. system("color A0");
  44.  
  45. // Ocultar cursor.
  46. CONSOLE_CURSOR_INFO cci;
  47. GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  48. cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
  49. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  50.  
  51. Byte unEstado = 0b11001000;
  52.  
  53. for (Byte i = 0; i < EST_TODOS_LOS_CONTROLADORES; i++)
  54. {
  55. printf("El bit: %i tiene valor %s\n", i, (LeerBit(unEstado, i) ? "Activo" : "Inactivo"));
  56. }
  57. cout << endl; // Nueva línea.
  58. system("pause");
  59. return 0;
  60. }

Voy a hacerlo ahora mismo en C# en modo consola y luego a Windows Form.

Gracias por el detalle.  ;-)
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines