Autor Tema: Ingresar cadena o float por eusart1  (Leído 2054 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
Ingresar cadena o float por eusart1
« en: 06 de Julio de 2021, 15:40:06 »
Buenos dias todopics  8) , deseo realizar una pregunta . Tengo el siguiente codigo en XC8, PIC16F1947, que funciona bien:
He logrado ingresar con el teclado de PC cualquier numero, por serial (en proteus), pero solo puedo de un digito (1-9). Que funcion o como podria cambiar este codigo para que pueda ingresar mas de un digito o talvez un numero con coma  :? . Gracias  ((:-))

En el code configurator lo unico relevante que hice es:
1. En el oscillator: INTOSC, FOSC, 8MHZ, PLL enabled ---> current system clock 32MHZ
2. agregar modulo EUSART1 y marcar la opcion "redirect stdio to usart".

MAIN.C :

#include "mcc_generated_files/mcc.h"


/*
                         Main application
 */
void main(void)
{   
    // initialize the device
    SYSTEM_Initialize();

    int opcion, valor, res;
   
    printf("\r Introduzca un valor entero mayor que 0:\n");
    printf("\r ");
   
    valor = getch();
    valor = valor-48;                               //Codigo ASCII
    printf("\r El valor ingresado es %i",valor);    ///Ingresado por RVR
    printf("\r ");
   
    printf("\r ***Menu de opciones***");
    printf("\r 1-Averiguar el cuadrado:");
    printf("\r 2-Averiguar el cubo:\n");
    printf("\r 3-Averiguar si es par o no:");
   
    printf("\r Ingrese opcion:");
    printf("\r ");
   
    opcion = getch();
    opcion = opcion-48;                             //Codigo ASCII
    printf("\r La opcion escogida es %i",opcion);   ///Ingresado por RVR
   
    switch(opcion)
    {
        case 1:
            res = valor*valor;
            printf("\r El cuadrado de %i es %i",valor,res);
            break;
        case 2:
            res = valor*valor*valor;
            printf("\r El cubo de %i es %i",valor,res);
            break;
        case 3:
            res = valor%2;
            if(res)
                printf("\r El numero %i es impar",valor);
            else
                printf("\r El numero %i es par",valor);
            break;
        default:
            printf("\r Opcion erronea");
    }
    printf("\r ");
   
    while (1)
    {
        // Add your application code
    }
}


Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ingresar cadena o float por eusart1
« Respuesta #1 en: 06 de Julio de 2021, 19:22:39 »
Te creas un array con la longitud de la cifra máxima que quieres recibir o más. 

 Usas gets() para capturar todos los caracteres hasta que se pulse “enter”.’

Luego te toca recorrer el string e ir parseando carácter por carácter para obtener el entero o el float si usas o admites “,” .


  Otra forma sin usar gets(); sería metiendo en un bucle while el getc(); e ir almacenando las entradas manualmente en un array. La condición del while sería (mientras no se reciba un “enter” o no se haya llenado el array)

  Luego lo mismo, recorres el array, lo parseas y obtienes los enteros o los floats o lo que necesites. 

  Saludos.
 

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
Re:Ingresar cadena o float por eusart1
« Respuesta #2 en: 07 de Julio de 2021, 00:47:26 »
Gracias por responder, acabo de intentar el uso de gets(), pero recurrentemente me da error. Con el while me parece que puede ir aunque tendria que ver masomenos como hacerlo. Aunque esto deberia ser algo que se haga en pocas lineas en c  :? , que raro  :(.
Y aunque gets() esta en el documento 50002737D.pdf MPLAB® "XC8 C Compiler User’s Guide" , en la pagina 411, no se porque no funciona...

Error:
C:\Program Files\Microchip\xc8\v2.32\pic\sources\c99\common\nf_getc.c:14:: error: (1098) conflicting declarations for variable "_getch" (mcc_generated_files/eusart1.c:141)
(908) exit status = 1

MAIN.C:

#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <stdlib.h>

/*
                         Main application
 */

void main(void)
{   
    // initialize the device
    SYSTEM_Initialize();

    char b[50];
   
    gets(b);
    printf("Texto: %s \n", b);
   
    while (1)
    {
        // Add your application code
    }
}

help!!!
« Última modificación: 07 de Julio de 2021, 00:51:44 por zororyuzaki »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ingresar cadena o float por eusart1
« Respuesta #3 en: 07 de Julio de 2021, 04:13:34 »
Esto debería servirte para recibir el string hasta que pulses tecla intro o hasta que se llene el array.

Código: C
  1. char b[50];
  2. int i=0;
  3.  
  4. for(i=0;i<50;i++) b[i] = 0xff;   // Inicializa el string.
  5. i=0;   // Índice para el string a cero.
  6.  
  7.  
  8. while(i<50) {  // Mientras haya espacio en el array, recibimos caracteres.
  9. b[i] = getc();
  10. if (b[i++] == 13) break;  // así recibimos “return” salimos del bucle.
  11. }

Desconectado zororyuzaki

  • PIC10
  • *
  • Mensajes: 8
Re:Ingresar cadena o float por eusart1
« Respuesta #4 en: 07 de Julio de 2021, 15:25:06 »
Vaya, error, investigare mas

#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <stdlib.h>


/*
                         Main application
 */
void main(void)
{   
    // initialize the device
    SYSTEM_Initialize();

    char b[10];
    int i=0;
   
    for(i=0;i<10;i++) b = 0xff;   // Inicializa el string.
    i=0;   // Índice para el string a cero.

    while(i<10)
    {  // Mientras haya espacio en el array, recibimos caracteres.
        b = getc();
        if (b[i++] == 13) break;  // así recibimos “return” salimos del bucle.
    }

    printf("Texto: %s \n", b);
   

    while (1)
    {
        // Add your application code
    }
}


main.c:81:21: error: too few arguments to function call, expected 1, have 0
        b = getc();
               ~~~~ ^
C:\Program Files\Microchip\xc8\v2.32\pic\include\c99\stdio.h:88:1: note: 'getc' declared here
int getc(FILE *);
^
1 error generated.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Ingresar cadena o float por eusart1
« Respuesta #5 en: 07 de Julio de 2021, 17:15:51 »
Le has quitado el índice al vector b.

  b[i++] = getc();

  Sin embargo has puesto:

  b = getc();

  Así no puede ser.

 En el for inicial de inicializacion también has quitado el índice.  No digo que sea el motivo del error que te da, pero es un motivo claro de que te de error.


 

anything