[Résolu] Convertir un arrray

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!!

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]"

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:

char buf_tampon_2[20];
sprintf( buf_tampon, "bat_duino=%f", val_A4 );

En convertissant le float en int:

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.

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.

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

Alors je dois pas etre tres bon ou j'ai loupé quelque chose?
j"arrive bien a transmetre mais du cote reception j'obtien =

bat_duino=?

et meme en debugant avec le teminal =

bat_duino=?+des caracteres bizar

Voila ma fonction complete =

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
}

:frowning: Qu'est ce qui ne va pas ?

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() : avr-libc: <stdlib.h>: General utilities

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
}

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!

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
}