Quiero convertir DS18B20 temperatura (código de 4 bytes de la hoja de datos) en una cadena con Precisión 0.1 ° C (como sprintf %.1f
). AVR. Lenguaje C (avr-gcc). Necesito el código pequeño , por lo que sprintf
, tipos de punto flotante y round
de math.h es una mala idea. Mi siguiente código actual también es malo:
void reverse_string(char *s)
{
char *p, c;
for (p = s + strlen(s) - 1; s <= p; ++s, --p) {
c = *p;
*p = *s;
*s = c;
}
}
void ts_to_string(uint16_t ts, char *s)
{
int8_t n = (int8_t)(ts >> 4);
uint8_t neg = n & 0x80;
char *p = s;
float f;
if (neg)
n = -n-1;
do {
*p++ = n % 10 + '0';
} while ((n /= 10) > 0);
if (neg)
*p++ = '-';
*p = 'void reverse_string(char *s)
{
char *p, c;
for (p = s + strlen(s) - 1; s <= p; ++s, --p) {
c = *p;
*p = *s;
*s = c;
}
}
void ts_to_string(uint16_t ts, char *s)
{
int8_t n = (int8_t)(ts >> 4);
uint8_t neg = n & 0x80;
char *p = s;
float f;
if (neg)
n = -n-1;
do {
*p++ = n % 10 + '0';
} while ((n /= 10) > 0);
if (neg)
*p++ = '-';
*p = '%pre%';
reverse_string(s);
*p++ = '.';
f = (float)(ts & 0xf) / 16.0;
if (neg)
f = 1.0-f;
*p++ = (char)round(f * 10.0) + '0';
*p = '%pre%';
}
';
reverse_string(s);
*p++ = '.';
f = (float)(ts & 0xf) / 16.0;
if (neg)
f = 1.0-f;
*p++ = (char)round(f * 10.0) + '0';
*p = '%pre%';
}