Go Down

Topic: [Résolu] Convertir un arrray (Read 944 times) previous topic - next topic

cutprod

Sep 02, 2012, 12:32 am Last Edit: Sep 03, 2012, 06:40 pm by cutprod Reason: 1
Bonjour a tous,
Pour transmettre une valeur analogique j'utilise un shield wifi RedFly,
j' ai besoin d' un array de type "uint8_t".
En partant d'un "float" je parviens a array de type "char" et après je bloque  :0
Impossible ... je n'y parviens pas!!
Code: [Select]
char buf_tampon_2[14];//le tableau a transmettre (c'est lui que je doit convertir en "uint8_t")
char buf_tampon[10];//pour la fonction itoa
int A4_int = val_A4*100;//je transforme un "float" en "int"
String A4_val = itoa(A4_int,buf_tampon,10);
String bat_1 = ("bat_duino=" + A4_val);//je rajoute un identifan a la chaine (pour le traitement a l'arrivée)
bat_1.toCharArray(buf_tampon_2, 14);

La méthode est-elle bonne ?
peut être existe il plus simple ?
Pouvez vous m'aider a finir ma fonction , a transformer "char buf_tampon_2[14]" en "uint8_t buf_tampon_2[14]"

barbudor

uint8_t ou char c'est pareil

la principale question : veux tu transmettre en ASCII ou en binaire ?

Apparemment c'est une chaîne de caractères que tu veux transmettre : "bat_duino=xxxx" où xxxx est la valeur de ton float val_A4 convertie en entier ?

Pourquoi convertir en entier ? Juste parce que tu ne sais pas utilsier le float ou bien as tu une raison ?

Sans convertir le float en int:
Code: [Select]
char buf_tampon_2[20];
sprintf( buf_tampon, "bat_duino=%f", val_A4 );


En convertissant le float en int:
Code: [Select]
char buf_tampon_2[20];
sprintf( buf_tampon, "bat_duino=%d", (int)(100*val_A4) );


tu peux ensuite envoyer en faisant un cast :  (uint8_t*)buf_tampon
Si tu as besoin de la longueur : strlen(buf_tampon)+1 pour être sur de transmettre le marqueur de fin
Ou bien sizeof( buf_tampon) mais tu transmet plus que nécessaire.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

cutprod

#2
Sep 02, 2012, 07:28 pm Last Edit: Sep 02, 2012, 10:38 pm by cutprod Reason: 1
merci pour ta réponse.
le float en int car je connaissais un la fonction itoa, pour me rapprocher du format désiré...
Mais si je reste en float c'est encore mieux!
Je teste le cast ce soir et je te tient au courant.
Merci.

skywodd

Bonjour,

Petite remarque quand même :
char = valeur signé
byte = uint8_t = unsigned char = valeur non signé.

Dans ton cas le cas signé -> non signé ne pose pas de probléme (un caractére ascii est codé sur une plage 0~127), mais ne pas confondre les deux ;)

Pour décortiquer la convention de nommage de <stdint.h> c'est hyper simple, exemple uint8_t :
u = unsigned (non signé) (signé = rien, exemple int8_t)
int = valeur décimal
8 = sur 8 bits
_t = type
-> Type de valeur décimal non signé sur 8 bits
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

cutprod

Alors je dois pas etre tres bon ou j'ai loupé quelque chose?
j"arrive bien a transmetre mais du cote reception j'obtien =
Code: [Select]
bat_duino=?
et meme en debugant avec le teminal =
Code: [Select]
bat_duino=?+des caracteres bizar
Voila ma fonction complete =
Code: [Select]

void mesure_bat(){
uint8_t* buf_bat;   
float echelle = 0.0195503421309873;//=20/1023 car 20 Vcc maxi pour 1023 pas
val_A4 = (analogRead(A4))* echelle; 
char buf_tampon[64];
sprintf( buf_tampon, "bat_duino=%f", val_A4 );
buf_bat = (uint8_t*)buf_tampon;
RedFly.socketSend(hTCP, buf_bat,64 ); //send data to TCP socket
}


:( Qu'est ce qui ne va pas ?

barbudor

C'est ma faute
Apparemment par défaut la fonction sprintf() sur AVR ne supporte pas "%f"
C'est possible a ajouter mais un peu compliqué quand l'environnement Arduino

On va plutot essayer dtostrf() : http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42

Code: [Select]
void mesure_bat(){
float echelle = 0.0195503421309873;//=20/1023 car 20 Vcc maxi pour 1023 pas
val_A4 = (analogRead(A4))* echelle; 
char buf_tampon[64];
strcpy( buf_tampon, "bat_duino=" );
dtostrf( val_A4, 5, 2, buf_tampon+10 );
RedFly.socketSend(hTCP, (uint8_t*)buf_bat,64 ); //send data to TCP socket
}
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

cutprod

#6
Sep 03, 2012, 06:40 pm Last Edit: Sep 03, 2012, 06:41 pm by cutprod Reason: 1
Je te remercie pour ton aide, cela fonctionne très bien.
Merci aussi a skywood pour le petit court c'est toujours bon a prendre!
Code: [Select]
void mesure_bat(){
float echelle = 0.0195503421309873;//=20/1023 car 20 Vcc maxi pour 1023 pas
val_A4 = (analogRead(A4))* echelle; 
char buf_tampon[64];
strcpy( buf_tampon, "bat_duino=" );
dtostrf( val_A4, 5, 2, buf_tampon+10 );
RedFly.socketSend(hTCP, (uint8_t*)buf_tampon,64 ); //send data to TCP socket
}

Go Up