Este artículo, que sirve como preparación para una discusión de cadenas (strings) en lenguaje C, presenta el concepto de caracteres ASCII y explica dos beneficios de las técnicas de codificación basadas en ASCII.
Un microprocesador o microcontrolador es una colección compleja de circuitos que manipulan voltajes lógicos altos y voltajes lógicos bajos. Para mayor comodidad, nos referimos a estos voltajes como unos y ceros, y diseñamos los procesadores de manera que estos unos y ceros puedan manipularse en conjunto y tratarse como números binarios.
La mayoría de la gente se volvería loca o se quedaría dormida si se vieran obligados a observar el flujo interminable de números binarios dentro y fuera de un microprocesador. La tecnología computacional ha transformado la existencia humana porque estos números binarios se pueden usar para representar cosas que a las personas realmente les importan: música, fotografías o, en el caso del ASCII, letras y dígitos.
Entendiendo el ASCII
ASCII significa Código Estándar Americano para el Intercambio de Información (American Standard Code for Information Interchange = ASCII). En este código, un número binario significa exactamente un caracter, donde «caracter» se refiere a una letra mayúscula, una letra minúscula, un dígito, un signo de puntuación, o varias otras cosas que se pueden encontrar en un teclado. La siguiente tabla le brinda la «traducción» entre los números (aquí, escrita en notación decimal en lugar de binaria) y los caracteres ASCII correspondientes al alfabeto en mayúsculas y minúsculas.
(Nota: Quede claro que cuando en EEUU dicen “americano” se refieren a algo que se aplica solamente a ellos, no a toda América. Quedaba afuera, en principio, toda letra que no se usa en el inglés actual, letras con acentos, diéresis, circunflejo, tildes, y otras diferenciaciones fonéticas en otros idiomas, y por eso se creó la tabla de ASCII extendido, que está incluida más abajo).
Es esencial comprender que su microcontrolador no sabe nada acerca de las letras del inglés u otra lengua (y menos aún de los caracteres acentuados de diferentes maneras o especiales en cada idioma), los signos de puntuación o los dígitos. Su microcontrolador es una máquina muy pequeña, diseñada para procesar números binarios, y cualquier carácter que esté presente en su lenguaje de máquina (firmware) es simplemente su interpretación de los números binarios.
Se puede producir una seria confusión debido a la impresión errónea de que sus variables, o elementos de matriz, contienen realmente caracteres ASCII de una forma u otra. El desarrollo de firmware se vuelve más claro, más ágil y más flexible cuando uno se da cuenta de que los caracteres en realidad son números binarios, y se pueden almacenar, transferir y manipular como números binarios; no se convierten en caracteres ASCII hasta que esté todo listo para interpretarlos como caracteres ASCII.
ASCII Extendido
Beneficios y contras del ASCII
El ASCII es necesario para la programación humana. Hay muchas aplicaciones integradas que pueden beneficiarse del uso de caracteres ASCII, y creo que es una buena idea adquirir el hábito de reconocer situaciones en las que se puede incorporar caracteres ASCII en su código.
Un estándar ampliamente utilizado
Un beneficio innegable de ASCII es la estandarización. Los entornos de desarrollo integrado, los programas de terminal y los paquetes de software computacional comprenden el ASCII y, por lo tanto, los caracteres ASCII son una forma conveniente y efectiva de transferir y mostrar información.
En este ejemplo, una aplicación muestra una representación binaria basada en datos de un sensor:
Transferencia de datos confiable
Un beneficio más sutil, pero quizás igual de importante, es el hecho de que el ASCII proporciona un medio para representar información utilizando un conjunto restringido de números binarios. Cualquier valor numérico puede representarse mediante una secuencia de los dígitos ASCII del 0 al 9 (junto con el punto decimal ASCII si es necesario). Estos caracteres ASCII corresponden a un subconjunto muy pequeño de los 256 valores ofrecidos por un número binario de 8 bits. Pero ¿por qué esto importa?
Imagine que tiene una aplicación en la que un microcontrolador debe transferir mediciones impredecibles y altamente variables de sensores de 8 bits a una PC. Si se transfieren los datos como números binarios ordinarios, un byte individual puede contener un número cualquiera del 0 al 255. Esto nos deja sin una forma conveniente y sencilla de organizar datos o incorporar comandos en el flujo de datos, porque para transferir las mediciones en bruto solo son necesarios todos los números binarios posibles. El PC (y menos nosotros) no puede distinguir entre los datos de medición numéricos y otros tipos de información.
Si se transfieren los datos de medición utilizando caracteres ASCII en lugar de números binarios ordinarios, entran en juego los beneficios de un conjunto restringido. Solo se necesitan diez valores binarios (correspondientes a los dígitos ASCII del 0 al 9) para representar los datos numéricos, y varios otros valores binarios pueden reservarse para una funcionalidad especial, porque nunca aparecerán en los datos de medición.
Aquí, los dígitos ASCII se utilizan para transferir una lectura de temperatura. El final de cada lectura se identifica con un retorno de carro (abreviado CR = Carrier Return); el valor binario correspondiente a CR nunca aparecerá en los datos de medición.
Reducción de la eficiencia
El precio que se paga por esta estandarización y transferencia de datos mejorada es que se usa con menos eficiencia la memoria, el ancho de banda del procesador y el ancho de banda de la comunicación.
El ASCII es un sistema basado en bytes. Cada carácter requiere ocho bits, incluyendo, por ejemplo, el dígito «1», que en circunstancias binarias normales puede representarse mediante un número de 1 bit en lugar de un número de 8 bits.
En la experiencia de un programador actual, esto rara vez es un problema serio; los microcontroladores modernos tienen recursos de procesamiento y memoria que exceden con creces los requisitos de muchas aplicaciones. Sin embargo, si realmente se necesita maximizar el rendimiento o minimizar el uso de la memoria, es posible que debamos renunciar a la conveniencia de usar ASCII.
De ASCII a cadenas de caracteres
Este artículo no es solo una descripción general de ASCII sino también una introducción a la forma en que se maneja una representación basada en caracteres en el lenguaje de programación C. Nos referimos a este tipo de representación como una cadena (string), que es una secuencia o «encadenamienro» de caracteres ASCII.
Veremos más en detalle las cadenas en un próximo artículo.