Dividir un número entero como una cadena (no está bien explicado pero…)

programación


Hola a todos,
Esto se utiliza para saber cómo hago este ejercicio de pensamiento.
Tengo una unión que devuelve un valor de un sensor de Balance. Funciona bien en el monitor de serie, pero estoy intentando mostrarlo en la pantalla LCD. Algunos hurgando han demostrado que la función para mostrar

C++
lcd.print()

solo imprimirá un carácter en la pantalla.

Lo que he probado:

Al convertir la salida de la unión en una cadena, el problema es que la cadena no existe en este sistema,

C++
char[]

existe, yo también puedo hacerlo

C++
char readOut[8];  
for(int a =0; a<=7; a++) 
  gyro.output.z = readOut[a];

El problema es cómo dividir la matriz en valores individuales que luego se pueden cargar en el archivo char.[]??

Tienes una idea de hacia dónde estoy tratando de llegar aquí…
Estoy tratando de usar un sensor de equilibrio para informar con precisión si una ‘prensa’ está nivelada (no son las pendientes del piso), por lo que a Muggins se le dio la tarea de probarlo… el sensor de equilibrio regresa (accel_t_gyro.value.z_gyro) que es una unión formada por lo siguiente:

C
typedef union accel_t_gyro_union
{
struct {
uint8_t x_accel_h;
uint8_t x_accel_l;
uint8_t y_accel_h;
uint8_t y_accel_l;
uint8_t z_accel_h;
uint8_t z_accel_l;
uint8_t t_h;
uint8_t t_l;
uint8_t x_gyro_h;
uint8_t x_gyro_l;
uint8_t y_gyro_h;
uint8_t y_gyro_l;
uint8_t z_gyro_h;
uint8_t z_gyro_l;
} reg;

struct {
int16_t x_accel;
int16_t y_accel;
int16_t z_accel;
int16_t temperature;
int16_t x_gyro;
int16_t y_gyro;
int16_t z_gyro;
} value;
};

entonces da un número de cuatro dígitos 4988, por ejemplo. Bien. La pantalla LCD que estoy usando solo mostrará un carácter a la vez, si por ejemplo envías ‘4988’ obtendrás un ‘4’, así que estaba pensando si convierto el int en un carácter.[] matriz puedo usar un for() para contar las posiciones y la salida desde allí

C
for(int a = 0; a <= 7; a++) {
  // char[a] to int[a] type thing
}
lcd.print(a);

Solución 1

En C, un carácter[] es efectivamente una cadena: agregue un valor nulo ‘\0’ al final y es una cadena para todos los propósitos prácticos; se denominan “cadenas terminadas en nulo”

Para enviar a la cadena, tendría que asignar a readOut[a] en lugar de leerlo y dividir su valor en caracteres, lo cual no es difícil, pero dependerá de en qué esté realmente almacenada la entrada.

Busque en Google “C convertir entero en cadena” y “C convertir entero en cadena hexadecimal” para obtener algunas ideas.

Solución 2

Según los tipos de datos presentados, el sensor almacena el resultado como un número binario en un entero de 16 bits. El primer paso sería averiguar cuál es el valor máximo y mínimo de z_gyro. Si resultan ser valores de 4 dígitos con un signo, se necesitarán al menos 6 caracteres para la conversión en una cadena de caracteres. Si la lectura del búfer se declara con 8 bytes, no hay ningún problema en utilizar la longitud de la cadena para la salida.
Sugiero convertir primero el valor entero en una cadena. Si puedes usar el comando C sprintf(), esto es fácil:

C
sprintf(readOut, "%d", sensor.value.z_gyro);

Luego use un bucle for para pasar todos los caracteres individualmente al final de la cadena a la función print().

C
for (int i = 0; i < strlen(readOut); i++)
    lcd.print(readOut[i]);

Si la función sprintf() no está disponible, itoa() aún sería posible o podrías programar la conversión tú mismo en un bucle.

Con la información adicional “sprintf, de hecho, ¡todas las funciones f (imprimir, escanear) no existen!” sería posible escribir usted mismo una función genérica simple. Podría verse así:

C
void intToCString(int num, char* str) {
    if (num < 0) {
        *str++ = '-';
        num = -num;
    }

    int divisor = 1;
    while (num / divisor > 9) {
        divisor *= 10;
    }

    while (divisor > 0) {
        *str++ = '0' + (num / divisor);
        num %= divisor;
        divisor /= 10;
    }

    *str = '\0';
}

Solución 3

Si no tienes itoa, puedes usar sprintf(), pero eso es bastante pesado para una tarea tan liviana. Lo siguiente debería funcionar para usted

C
int magnitude(int x)
{
    int i;
    x = abs(x);
    for(i = 0; x > 0; x /= 10, ++i);
    return i;
}

char *i2cstr(int i, char *buff) 
{
    int n = magnitude(i);

    /*  The following is only needed if i may be negative */ 
    int last = 0;
    if(i < 0) {
        i *= -1;
        buff[0] = '-';
        n += 1;
        last = 1;
    }
    /* end of dealing with negative numbers */
    
    buff[n] = 0;
    for(--n; n >= last; --n ) {
        buff[n] = i%10 + '0';
        i/= 10;
    }
    return buff;
}

Advertencia: parámetro buff for i2cstr() debe tener el tamaño adecuado. Para uint16_t son 6 caracteres, incluida la terminación nula.

Solución 4

Si solo necesita generar el valor, no es necesario convertirlo primero en una cadena.

C
void putaschar(int16_t n)
{
    if( n == 0 ) {
        /* special case for n == 0 */
        putchar('0');
    } else {
        if(n < 0) {
            /* oputput sign, and make n +ve */
            putchar('-');
            n *= -1;
        }

        /* determine largest power of 10 smaller than n */
        int16_t divisor = 10000;  /* maximum power of 10 that will fit in int16 */
 
        while( n / divisor == 0) {
            divisor /= 10;
        }

        /* send chars to the output device */
        do {
            putchar(n/divisor + '0');
            n %= divisor;
            divisor /= 10;
        } while(divisor > 0);
    }
}

en lo anterior, suponga que putchar() reemplaza cualquier magia que necesites hacer para enviar un carácter a la pantalla.

コメント

タイトルとURLをコピーしました