Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 2 Abril 2021, 13:14 pm



Título: Leer bits de Byte
Publicado por: Meta 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.


Título: Re: Leer bits de Byte
Publicado por: BloodSharp 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:
(https://i.imgur.com/KYHANWW.png)

B#


Título: Re: Leer bits de Byte
Publicado por: Meta en 2 Abril 2021, 19:46 pm
Buen truco en C++.

Me funcionó en modo consola en Windows.
(https://social.msdn.microsoft.com/Forums/getfile/1659615)
Ver imagen (https://social.msdn.microsoft.com/Forums/getfile/1659615).

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.  ;-)