domingo, 2 de septiembre de 2018

Control de flujo; Condicional "if". Código ASCII

Condicional If
A continuación vamos a introducirnos con el condicional if, el sketch que acompaña esta publicación es un tanto particular, con él obtenemos por consola la tabla ASCII con su valor decimal, hexadecimal, octal y su valor char, a este programa yo le llamo "Utilidad" y así lo tengo guardado en su correspondiente carpeta.
El código ASCII es interesante tenerlo siempre a mano. Las particularidades de este scketch son dos, la primera es que vamos a controlar el flujo a través de un condicional IF, bueno en realidad hay que saber que la función void loop() va a seguir ejecutándose lo que hacemos es imprimir por pantalla UNA sola vez lo que nos interesa. (Lineas 33 y 58)
Y la otra particularidad está en la función write() que utilizamos en este caso para que nos haga un casting del valor decimal al valor de su Char correspondiente. (Linea 53) Como los valores Char no son todos imprimibles he tenido que auxiliarlo con un array de Strings, que imprime en su caso la actuación que lleva a cabo.
Nótese que la cabecera se imprime desde el void setup() que como ya sabemos solo se ejecutará una vez. También hay que fijarse en los nuevos parámetros que la función print() reconoce DEC, HEX, OCT y BIN, la función convierte o hace una especie de casting; coge el valor del primer parámetro, lo convierte al formato del segundo parámetro e imprime el resultado.

Aquí debajo os dejo una captura del resultado por consola:

Y a continuación el código:

  int i, x; // las variables declaradas aqui tienen un alcance global y seran reconocidas tanto por el void setup como por el void loop
// las variables anteriores NO se han inicializado, al hacer esto la variable toma su valor inicial por defecto, que es cero.

// declaramos un array de tipo String (que contendra cadenas de caracteres) llamada noImpr y que tendra 33 elementos
String noImpr[33]= {"[NULL],Caracter Nulo", "[SQH],Inicio Cabecera", "[STX],Inicio Texto", "[ETX],Fin texto", "[EOT],Fin Transmison", 
"[ENQ],Identificacion", "[ACK],Acuse recibo",
"[BEL],Timbre", "[BS],Retroceso", "[HT],Tab. horizontal", "[LF],Nueva Linea", "[VT],Tab. vertical", "[FF],Nueva Pagina", "[CR],Retorno carro", 
"[SO],Desplaza afuera", "[SI],Desplaza adentro", "[DLE],Esc. vinculo datos", "[DC1],Control disp.1", "[DC2],Control disp.2", 
"[DC3],Control disp.3", "[DC4],Control disp.4", "[NAK],Conf. negativa", "[SYN],Inactividad sincr.", "[ETB],Fin bloque trans.", "[CAN],Cancelar",
"[EM],Fin del Medio", "[SUB],Sustitucion", "[ESC],Escape", "[FS],Separacion arch.", "[GS],Separacion grupos", "[RS],Separacion registros", 
"[US],Separacion Unid.", "[ ],Espacio en blanco"
};

void setup() {

  Serial.begin(9600); // abre el puerto serie a 9600 bps para mostrar los resultados por consola 

  // imprime la cabecera
  Serial.print("DEC\t"); // imprime la cabecera DEC y tabula por \t
  Serial.print("HEX\t"); // imprime la cabecera HEX y tabula por \t
  Serial.print("OCT\t"); // imprime la cabecera OCT y tabula por \t
  Serial.print("BIN\t"); // imprime la cabecera BIN y tabula por \t
  Serial.print("Char\n");// imprime la cabecera Char y hace salto de linea por \n
}

void loop() {

  if (x < 128){ // Cuando x sea igual o mayor a 128 dejara de entrar en este condicional
    // imprime la salida en varios formatos:
    Serial.print(i, DEC); // imprime como un ASCII-codificado decimal
    Serial.print("\t"); // imprime un tab

    Serial.print(i, HEX); //imprime como un ASCII-codificado hexadecimal
    Serial.print("\t"); // imprime un tab

    Serial.print(i, OCT); // imprime como un ASCII-codificado octal
    Serial.print("\t"); // imprime un tab

    Serial.print(i, BIN); // imprime como un ASCII-codificado binario
    Serial.print("\t"); // imprime un tab

    if(i==127){Serial.print("[DEL],Suprimir");} // imprime el valor indicado, si i es igual a 127
    if(i<33){ // si i es inferior a 33 entra aqui
      Serial.println(noImpr[i]); // Toma la cadena del array noImpr
    } else { // si i NO es inferior a 33 entra aqui
       Serial.write(i); // imprime el valor char de ASCII
       Serial.println(); // imprime un salto de linea
      } 

    i++; // suma un valor a i
    x++; // suma un valor a x
  } // cierra el condicional de x
} // Cierra void loop

Por cierto, el código ASCII se diferencia en tres grupos; 1- Los no imprimibles (éstos son los que he incluido en el array noImpr[], para que sepais lo que hace) 2- Los imprimibles (son los que si se imprimen) y 3 - ASCII extendido; si deseas emplear algún "simbolito extraño" basta que cambies la linea 33: 'x < 128' por 'x < 256'

No hay comentarios:

Publicar un comentario

Gracias por tu comentario, en breve lo revisaremos.