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

 

 


Tema destacado:


+  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 2,009 veces)
Meta


Desconectado Desconectado

Mensajes: 3.439



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

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


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.439



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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Sources Code] RotBits [Byte TO Byte ]
Programación Visual Basic
x64core 8 5,346 Último mensaje 22 Octubre 2011, 00:46 am
por BlackZeroX
Suma byte a byte con acarreo en variable de 2 bytes
Programación C/C++
AlbertoBSD 2 3,991 Último mensaje 18 Mayo 2016, 18:21 pm
por AlbertoBSD
leer datos de comunicacion serial (BYTE) de indicador de peso y convertir a int « 1 2 3 »
Programación C/C++
pedromigl010 22 12,220 Último mensaje 3 Julio 2016, 17:42 pm
por pedromigl010
leer cdroms windows 95 o 98 16 bits
Software
bullock78 2 1,220 Último mensaje 24 Junio 2017, 04:16 am
por Eleкtro
Leer puro byte del puerto serie
.NET (C#, VB.NET, ASP)
Meta 0 2,896 Último mensaje 8 Noviembre 2023, 21:40 pm
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines