DÍA 013 DE 365

Fase 1: Fundamentos de C y Lógica de Software

📖 Teoría Explícita: El Mito del "String" y el Código ASCII

1. La Ilusión del Texto

Un microcontrolador no sabe qué es una "A" o una "B". Solo entiende de voltajes y números binarios. Para manejar texto, C utiliza un arreglo de variables tipo char (enteros de 8 bits). Cada número representa una letra según la Tabla ASCII. Por ejemplo, el número decimal 71 es la letra 'G', el 65 es la 'A' y el 83 es la 'S'.

2. El Terminador Nulo (`\0`): La Regla de Vida o Muerte

Cuando envías un arreglo de caracteres a un puerto serial UART o a una pantalla, la función iterará leyendo bytes sin parar. ¿Cómo sabe el procesador cuándo termina la palabra y comienza la basura de la memoria RAM? Mediante el Carácter Nulo (el byte 0x00 o '\0'). Si olvidas colocar este byte al final de tu arreglo, la función seguirá leyendo memoria RAM y enviando caracteres extraños (basura) a tu pantalla hasta provocar un Hard Fault.

3. ¿Por qué prohibimos `sprintf`?

En el mundo Maker, es común usar sprintf(buffer, "VOL: %f", volumen);. En el desarrollo industrial crítico, esta función de la librería <stdio.h> está estrictamente prohibida. sprintf inyecta hasta 15 Kilobytes de código de emulación en tu memoria Flash, es lenta, arruina el determinismo, requiere cálculos de coma flotante y es susceptible a desbordamientos de búfer (Buffer Overflow). Nosotros formatearemos el ticket utilizando conversiones aritméticas directas y asignaciones manuales en el arreglo de caracteres.

ANATOMÍA DE UN "STRING" EN LA MEMORIA RAM char ticket[6]; // Capacidad: 6 Bytes 'G' ASCII: 71 [0] 'A' ASCII: 65 [1] 'S' ASCII: 83 [2] '\0' NULO (0x00) [3] Basura en RAM Ignorado por UART [4] y [5] El procesador detiene la lectura exactamente aquí. Si olvidas '\0', enviará toda la basura contigua.

⚙️ Ejercicios Prácticos: Código C Estricto

Ejercicio 1: Formateador Manual de Ticket. Escribiremos una función de bajo nivel que tome nuestro volumen (en punto fijo) y lo convierta a caracteres ASCII inyectando manualmente el punto decimal y el terminador nulo. El truco ASCII maestro: si a un número del 0 al 9 le sumas el caracter '0' (que es el 48 decimal), ¡se convierte en el caracter imprimible de ese número!


#include <stdint.h>

// El Búfer Global donde construiremos el texto del ticket (Max 32 caracteres)
char buffer_impresora[32];

/**
 * @brief Convierte un entero a texto ASCII (Reemplazo ligero de sprintf).
 * @param volumen_ml Volumen de gas en mililitros exactos (Ej: 10450).
 */
void Formatear_Ticket_Impresora(uint32_t volumen_ml) {
    uint8_t i = 0;
    
    // 1. ASIGNACIÓN ESTÁTICA DEL ENCABEZADO
    buffer_impresora[i++] = 'V';
    buffer_impresora[i++] = 'O';
    buffer_impresora[i++] = 'L';
    buffer_impresora[i++] = ':';
    buffer_impresora[i++] = ' ';
    
    // 2. EXTRACCIÓN DE DÍGITOS (Punto Fijo)
    // Extraemos la parte entera (Litros) y la fraccionaria (Mililitros)
    uint32_t litros = volumen_ml / 1000;
    uint32_t mililitros = volumen_ml % 1000;
    
    // Para simplificar este ejercicio fundamental, asumiremos un despacho de 2 dígitos.
    // Ej: 15 Litros
    uint8_t decenas = litros / 10;
    uint8_t unidades = litros % 10;
    
    // TRUCO ASCII: Transformamos el valor (0-9) a texto sumando '0' (48)
    buffer_impresora[i++] = decenas + '0'; 
    buffer_impresora[i++] = unidades + '0';
    
    // Insertamos el punto decimal manual (Evitamos la pesadilla del Float)
    buffer_impresora[i++] = '.';
    
    // Extraemos los mililitros (Ej: 450)
    uint8_t deci = mililitros / 100;
    uint8_t centi = (mililitros / 10) % 10;
    uint8_t mili = mililitros % 10;
    
    buffer_impresora[i++] = deci + '0';
    buffer_impresora[i++] = centi + '0';
    buffer_impresora[i++] = mili + '0';
    
    buffer_impresora[i++] = ' ';
    buffer_impresora[i++] = 'L';
    
    // 3. RETORNO DE CARRO Y SALTO DE LÍNEA
    buffer_impresora[i++] = '\r'; // CR (Carriage Return)
    buffer_impresora[i++] = '\n'; // LF (Line Feed)
    
    // 4. EL MANDAMIENTO FINAL: EL TERMINADOR NULO
    // Sin esta línea, la impresora térmica enloquecerá
    buffer_impresora[i] = '\0';
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Hito Logrado: Parseo de cadenas de texto sin librerías estándar pesadas.

El código anterior parece tedioso para un programador web, pero para un Arquitecto de Silicio es una obra de arte. Al evitar sprintf, has salvado el 80% de la memoria Flash de un microcontrolador pequeño y has mantenido el 100% de la predictibilidad en el tiempo de ejecución. La matemática de punto fijo se convierte suavemente en una trama de bytes lista para inyectarse en los registros de transmisión de la UART hacia una impresora térmica o un LCD transflectivo. Ahora eres dueño total del flujo de datos de tu máquina, bit por bit.

📝 Resumen del Día