Semana 11: Unidad 5

Trayecto de acciones, tiempos y formas de trabajo

Actividad 4

  • Fecha: septiembre 14 de 2020
  • Descripción: Te propondré otros ejercicios complementarios que necesitarás para afrontar otros protocolos binarios
  • Recursos: ingresa a Teams
  • Duración de la actividad: 1 hora , 20 minutos.
  • Forma de trabajo: grupal

Ejercicio 1

Analicemos el siguiente asunto:

Cuando trabajamos con protocolos binarios es necesario transmitir variables que tienen una longitud mayor a un byte. Por ejemplo, los números en punto flotante cumplen con el estándar IEEE754 y se representan con 4 bytes.

Algo que debemos decidir al trabajar con número como los anteriormente descritos es el orden en cual serán transmitidos sus bytes. En principio tenemos dos posibilidades: transmitir primero el byte de menor peso (little endian) o transmitir primero el byte de mayor peso (big endian). Al diseñar un protocolo binario deberemos escoger una de las dos posibilidades.

Ejercicio 2

¿Cómo transmitir un número de 16 bits?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 void setup() {
   Serial.begin(115200);

 }

 void loop() {
   //vamos a transmitir el 16205

   static uint16_t x = 0x3F4D;

   if (Serial.available()) {
     if (Serial.read() == 's') {
       Serial.write((uint8_t)( x & 0x00FF));
       Serial.write( (uint8_t)( x >> 8 ));
     }
   }
 }
  • ¿Qué endian estamos utilizando en este caso?

Ejercicio 3

¿Cómo transmitir un número en punto flotante?

Veamos dos maneras:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 void setup() {
     Serial.begin(115200);
 }

 void loop() {
     // 45 60 55 d5
     // https://www.h-schmidt.net/FloatConverter/IEEE754.html
     static float num = 3589.3645;

     if(Serial.available()){
         if(Serial.read() == 's'){
             Serial.write ( (uint8_t *) &num,4);
         }
     }
 }

Es posible que queramos copiar los bytes que componen el número previamente en un arreglo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 void setup() {
     Serial.begin(115200);
 }

 void loop() {
     // 45 60 55 d5
     // https://www.h-schmidt.net/FloatConverter/IEEE754.html
     static float num = 3589.3645;
     static uint8_t arr[4] = {0};

     if(Serial.available()){
         if(Serial.read() == 's'){
             memcpy(arr,(uint8_t *)&num,4);
             Serial.write(arr,4);
         }
     }
 }
  • ¿En qué endian estamos transmitiendo el número?
  • Y si queremos transmitir en el endian contrario?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 void setup() {
     Serial.begin(115200);
 }

 void loop() {
     // 45 60 55 d5
     // https://www.h-schmidt.net/FloatConverter/IEEE754.html
     static float num = 3589.3645;
     static uint8_t arr[4] = {0};

     if(Serial.available()){
         if(Serial.read() == 's'){
             memcpy(arr,(uint8_t *)&num,4);
             for(int8_t i = 3; i >= 0; i--){
               Serial.write(arr[i]);
             }
         }
     }
 }

Ejercicio 4

Y ahora cómo lidiamos con el protocolo binario del sensor de RFID desde la aplicación interactiva?

Ya habíamos dado algunas pistas, es decir, ya sabemos hacer varias cosas:

  • Inicializar el puerto
  • Enviar bytes
  • Saber si hay datos en el puerto serial
  • Leer los bytes

Por ejemplo, el siguiente código utiliza las cosas que ya sabemos usar y permite leer los bytes que se están enviando desde el arduino (toma el ejercicio anterior).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 using System;
 using System.IO.Ports;

 namespace serialRFID
 {
     class Program{
             static void Main(string[] args)
             {
                 SerialPort _serialPort = new SerialPort();
                 // Allow the user to set the appropriate properties.
                 _serialPort.PortName = "/dev/ttyUSB0";
                 _serialPort.BaudRate = 115200;
                 _serialPort.DtrEnable = true;
                 _serialPort.Open();
                 byte[] data = {0x73};
                 _serialPort.Write(data,0,1);
                 byte[] buffer = new byte[4];

                 while(true){
                     if(_serialPort.BytesToRead >= 4){
                         _serialPort.Read(buffer,0,4);
                         for(int i = 0;i < 4;i++){
                             Console.Write(buffer[i].ToString("X2") + " ");
                         }
                         Console.ReadKey();
                         _serialPort.Write(data,0,1);
                     }
                 }
             }
         }
 }

Ejercicio 5

Y si queremos que la aplicación interactiva lea los 4 bytes y lo convierta al número en punto flotante?

Pero antes de comenzar, ¿En qué endian se envía el número en punto flotante del ejercicio 3?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 using System;
 using System.IO.Ports;

 namespace serialRFID
 {
     class Program{
             static void Main(string[] args)
             {
                 SerialPort _serialPort = new SerialPort();
                 // Allow the user to set the appropriate properties.
                 _serialPort.PortName = "/dev/ttyUSB0";
                 _serialPort.BaudRate = 115200;
                 _serialPort.DtrEnable = true;
                 _serialPort.Open();
                 byte[] data = {0x73};
                 _serialPort.Write(data,0,1);
                 byte[] buffer = new byte[4];

                 while(true){
                     if(_serialPort.BytesToRead >= 4){
                         _serialPort.Read(buffer,0,4);

                         for(int i = 0;i < 4;i++){
                             Console.Write(buffer[i].ToString("X2") + " ");
                         }
                         Console.WriteLine();

                         Console.WriteLine(System.BitConverter.ToSingle(buffer,0));
                         byte [] bufferReverse = new byte[4];
                         for(int i = 3; i>= 0; i--) bufferReverse[3-i] = buffer[i];
                         Console.WriteLine(System.BitConverter.ToSingle(bufferReverse,0));

                         Console.ReadKey();
                         _serialPort.Write(data,0,1);
                     }
                 }
             }
         }
 }

Actividad 5

  • Fecha: septiembre 14 a septiembre 16 de 2020
  • Descripción: Repasa todo los visto hasta ahora
  • Recursos: material semana 10 y 11
  • Duración de la actividad: 5 horas
  • Forma de trabajo: individual

Actividad 6

  • Fecha: septiembre 16 de 2020
  • Descripción: sigamos aclarando dudas. ¿Ya estás preparado para el reto?
  • Recursos: ingresa a Teams
  • Duración de la actividad: 1 hora 40 minutos.
  • Forma de trabajo: grupal.