Pages: [1]   Go Down
Author Topic: [Résolu] Convertir un arrray  (Read 823 times)
0 Members and 1 Guest are viewing this topic.
Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-mad
Impossible ... je n'y parviens pas!!
Code:
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]"
« Last Edit: September 03, 2012, 11:40:30 am by cutprod » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
char buf_tampon_2[20];
sprintf( buf_tampon, "bat_duino=%f", val_A4 );

En convertissant le float en int:
Code:
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.
Logged

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 ?

Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: September 02, 2012, 03:38:19 pm by cutprod » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
bat_duino=?
et meme en debugant avec le teminal =
Code:
bat_duino=?+des caracteres bizar
Voila ma fonction complete =
Code:
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
}

 smiley-sad Qu'est ce qui ne va pas ?
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
}
Logged

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 ?

Sud-Ouest
Offline Offline
Full Member
***
Karma: 0
Posts: 117
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
}
« Last Edit: September 03, 2012, 11:41:45 am by cutprod » Logged

Pages: [1]   Go Up
Jump to: