Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

06/09/2010 #1


Código que funciona en C en mi ordenador pero no en micro (ATMEL)
Hola buenos días,

Tengo uná línea de código que funciona en mi ordenador en C pero no consigo que me funcione en el microcontrolador (marca ATMEL). La sentencia es muy sencilla:
sscanf(GPS_local_lat, "%2d%f,%c", &grad, &minus, &NS);
La variable GPS_local_lat está definida como:
char GPS_local_lat[15];
Y justo antes de la ejecución del sscanf vale: 4029.7545,N
Sin embargo al ejecutarse el sscanf en el micro sólo se almacena 40 en la variable grad, sin embargo no almacena nada en minus ni en NS. Al ejecutarse esta misma sentencia en mi ordenador, sí que se almacena además del 40 en grad, se almacena 29.7545 en la variable minus y N en la variable NS.

He probado a definir char *GPS_local_lat en el programa del micro pero funciona igual: almacena sólo 40 en grad, pero no almacena nada en minus ni en NS. También he probado a hacer:
sscanf(GPS_local_lat, "%2d%6.4f,%c", &grad, &minus, &NS);
pero ocurre lo mismo.

No sé si es que estoy haciendo algo mal o es un problema del microcontrolador, pues la misma sentencia me funciona correctamente en C en el ordenador. El caso es que me extraña mucho porque la sentencia es muy sencilla..

¿Sabéis qué puede estar pasando?

Muchas gracias, saludos
06/09/2010 #2

Avatar de Scooter

Respuesta: Código que funciona en C en mi ordenador pero no en micro (ATMEL)
¿Es la misma versión de C para ambos?
De C se poco, pero una variable char es de 8 bits luego solo puedes sacar el valor entero que va a la primera, definela como float.
No me hagas mucho caso en esto pero me suena que como los PCs usan 32 bits etc, aunque definas una variable como char, en realidad es de otro tipo mayor, así que en una variable char en el pc "caben mas cosas"
06/09/2010 #3


Respuesta: Código que funciona en C en mi ordenador pero no en micro (ATMEL)
Hola, gracias por responder.

No te entiendo muy bien cuando dices: "solo puedes sacar el valor entero que va a la primera, definela como float". ¿Te refieres que defina como float la variable grad?

sscanf(GPS_local_lat, "%2d%f,%c", &grad, &minus, &NS);

Porque en los ejemplos que he visto, la función sscanf he visto:
int sscanf(const char *cadena, const char *formato,...);

Por eso he definido el GPS_local_lat como un array de char: char GPS_local_lat[15];

Gracias de nuevo,

salu2
06/09/2010 #4


Respuesta: Código que funciona en C en mi ordenador pero no en micro (ATMEL)
Que librerías y compilador usas? Según el compilador y los switches del makefile la 'versión' del sscanf que se carga es más ligera o más pesada, es decir, ocupa más memoria de programa o menos. Y eso significa que soporta floats (el más pesado) o no (el más ligero). >8K de memoria para tal caso. Eso te pasa por usar librerías. Y encima, no se si soporta double.

Personalmente, a las librerías les tengo una manía que no te lo puedes creer. Unos me llaman paranoico, pero estoy hasta las narices de tener problemas como el que cuentas, precisamente debido a ellas. La única solución que yo conozco que funciona 100% es hacerse uno mismo las librerías. Así seguro que uno sabe lo que soportan y lo que no.
07/09/2010 #5


Respuesta: Código que funciona en C en mi ordenador pero no en micro (ATMEL)
Hola Beamspot, muchas gracias.

Creo que como dices lo que me está pasando puede ser debido a las librerías.
Estoy usando Arduino, que es una placa Harware que integra un microcontrolador de Atmel. El compilador C/C++ es avr-gcc.

Estudié C en la universidad hace tiempo y no soy un experto. Entiendo que un makefile es un archivo que define instrucciones a seguir para la compilación. En la carpeta creada al instalar el IDE he visto varios makefile. En uno de ellos está escrito literalmente:
# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
(Puede que esto signifique que está cargando la versión ligera...¿?)

Lo que me gustaría es solucionar el problema para que el sscanf soporte floats. El archivo stdio.h tiene acerca de sscanf lo siguiente:

/**
The function \c sscanf performs formatted input, reading the
input data from the buffer pointed to by \c buf.
See vfscanf() for details.
*/
extern int sscanf(const char *__buf, const char *__fmt, ...);

Lo que no sé es si hay que modificar este sdtdio.h o si existe una implementación de este archivo cabecera (no lo he encontrado...) para solucionar este problema y que el sscanf soporte floats. En definitiva: ¿es posible modificar las librerías para que sscanf soporte floats? ¿cómo he de hacerlo?

Muchas gracias, saludos
07/09/2010 #6


Respuesta: Código que funciona en C en mi ordenador pero no en micro (ATMEL)
Hay que mirar que hay que hacer para que la versión de scanf no sea la minimalista, que parece ser la causa del problema. No tengo ni idea de cómo se hace. Y para colmo, el Arduino es un 'traductor intermedio' que tiene sus propias librerías, de tal manera que aún empeora la situación.

Por desgracia no puedo ayudarte más, ya que tal y como he mencionado antes, nunca he usado estas librerías y he acabado usando las mías propias (más cortas, más rápidas, y hechas a medida para la aplicación). Aún así, debería haber bastante documentación (en inglés) en la página del GCC/WinAVR donde expliquen cómo cambiar las librerias (como por ejemplo, -lscanf_max).
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.